fix: windows crash report issues

This commit is contained in:
dapan 2023-01-04 15:11:01 +08:00
parent d260d75953
commit 47125b5d9d
3 changed files with 31 additions and 9 deletions

View File

@ -102,10 +102,10 @@ void taosResetTerminalMode();
symbol->SizeOfStruct = sizeof(SYMBOL_INFO); \ symbol->SizeOfStruct = sizeof(SYMBOL_INFO); \
\ \
if (frames > 0) { \ if (frames > 0) { \
offset = snprintf(buf, bufSize - 1, "obtained %d stack frames", frames); \ offset = snprintf(buf, bufSize - 1, "obtained %d stack frames", (ignoreNum > 0) ? frames - ignoreNum : frames); \
for (i = 0; i < frames; i++) { \ for (i = (ignoreNum > 0) ? ignoreNum : 0; i < frames; i++) { \
SymFromAddr(process, (DWORD64)(stack[i]), 0, symbol); \ SymFromAddr(process, (DWORD64)(stack[i]), 0, symbol); \
offset += snprintf(buf + offset, bufSize - 1 - offset, "frame:%i, %s - 0x%0X", frames - i - 1, symbol->Name, symbol->Address); \ offset += snprintf(buf + offset, bufSize - 1 - offset, "frame:%i, %s - 0x%0X", (ignoreNum > 0) ? i - ignoreNum : i, symbol->Name, symbol->Address); \
} \ } \
} \ } \
free(symbol); \ free(symbol); \
@ -131,10 +131,10 @@ void taosResetTerminalMode();
symbol->SizeOfStruct = sizeof(SYMBOL_INFO); \ symbol->SizeOfStruct = sizeof(SYMBOL_INFO); \
\ \
if (frames > 0) { \ if (frames > 0) { \
taosPrintLog(flags, level, dflag, "obtained %d stack frames", frames); \ taosPrintLog(flags, level, dflag, "obtained %d stack frames", (ignoreNum > 0) ? frames - ignoreNum : frames); \
for (i = 0; i < frames; i++) { \ for (i = (ignoreNum > 0) ? ignoreNum : 0; i < frames; i++) { \
SymFromAddr(process, (DWORD64)(stack[i]), 0, symbol); \ SymFromAddr(process, (DWORD64)(stack[i]), 0, symbol); \
taosPrintLog(flags, level, dflag, "frame:%i, %s - 0x%0X", frames - i - 1, symbol->Name, symbol->Address); \ taosPrintLog(flags, level, dflag, "frame:%i, %s - 0x%0X", (ignoreNum > 0) ? i - ignoreNum : i, symbol->Name, symbol->Address); \
} \ } \
} \ } \
free(symbol); \ free(symbol); \

View File

@ -419,8 +419,14 @@ void taosClientCrash(int signum, void *sigInfo, void *context) {
_return: _return:
taosLogCrashInfo("taos", pMsg, msgLen, signum, sigInfo); taosLogCrashInfo("taos", pMsg, msgLen, signum, sigInfo);
#if defined(WINDOWS)
exit(signum);
#endif
} }
void crashReportThreadFuncUnexpectedStopped(void) { atomic_store_32(&clientStop, -1); }
static void *tscCrashReportThreadFp(void *param) { static void *tscCrashReportThreadFp(void *param) {
setThreadName("client-crashReport"); setThreadName("client-crashReport");
char filepath[PATH_MAX] = {0}; char filepath[PATH_MAX] = {0};
@ -432,6 +438,12 @@ static void *tscCrashReportThreadFp(void *param) {
int32_t sleepTime = 200; int32_t sleepTime = 200;
int32_t reportPeriodNum = 3600 * 1000 / sleepTime; int32_t reportPeriodNum = 3600 * 1000 / sleepTime;
int32_t loopTimes = reportPeriodNum; int32_t loopTimes = reportPeriodNum;
#ifdef WINDOWS
if (taosCheckCurrentInDll()) {
atexit(crashReportThreadFuncUnexpectedStopped);
}
#endif
while (1) { while (1) {
if (clientStop) break; if (clientStop) break;
@ -499,7 +511,11 @@ void tscStopCrashReport() {
return; return;
} }
clientStop = 1; if (atomic_val_compare_exchange_32(&clientStop, 0, 1)) {
tscDebug("hb thread already stopped");
return;
}
while (atomic_load_32(&clientStop) > 0) { while (atomic_load_32(&clientStop) > 0) {
taosMsleep(100); taosMsleep(100);
} }

View File

@ -866,7 +866,12 @@ int32_t taosGenCrashJsonMsg(int signum, char** pMsg, int64_t clusterId, int64_t
tjsonAddIntegerToObject(pJson, "crashSig", signum); tjsonAddIntegerToObject(pJson, "crashSig", signum);
tjsonAddIntegerToObject(pJson, "crashTs", taosGetTimestampUs()); tjsonAddIntegerToObject(pJson, "crashTs", taosGetTimestampUs());
#if !defined(WINDOWS)
taosLogTraceToBuf(tmp, sizeof(tmp), 3); taosLogTraceToBuf(tmp, sizeof(tmp), 3);
#else
taosLogTraceToBuf(tmp, sizeof(tmp), 8);
#endif
tjsonAddStringToObject(pJson, "stackInfo", tmp); tjsonAddStringToObject(pJson, "stackInfo", tmp);
char* pCont = tjsonToString(pJson); char* pCont = tjsonToString(pJson);
@ -925,9 +930,10 @@ _return:
#ifndef WINDOWS #ifndef WINDOWS
taosPrintLog(flags, level, dflag, "sender PID:%d cmdline:%s", ((siginfo_t *)sigInfo)->si_pid, taosPrintLog(flags, level, dflag, "sender PID:%d cmdline:%s", ((siginfo_t *)sigInfo)->si_pid,
taosGetCmdlineByPID(((siginfo_t *)sigInfo)->si_pid)); taosGetCmdlineByPID(((siginfo_t *)sigInfo)->si_pid));
#endif
taosPrintTrace(flags, level, dflag, 3); taosPrintTrace(flags, level, dflag, 3);
#else
taosPrintTrace(flags, level, dflag, 8);
#endif
taosMemoryFree(pMsg); taosMemoryFree(pMsg);
} }