У меня есть приложение Windows/C++ (с использованием JUCE), и я хочу сбросить трассировку стека в файл, когда приложение выйдет из строя. В моем коде инициализации, у меня есть:windows/C++: как я могу получить полезную трассировку стека из обработчика сигнала?
signal(SIGABRT, abortHandler);
signal(SIGSEGV, abortHandler);
signal(SIGILL, abortHandler);
signal(SIGFPE, abortHandler);
И тогда мой обработчик выглядит следующим образом:
void abortHandler(int signum)
{
juce::File log("stacktrace.txt");
log.appendText(juce::SystemStats::getStackBacktrace());
exit(signum);
}
Однако, в результате трассировки стека не нить, где произошла авария:
0: AudulusDebug32: juce::SystemStats::getStackBacktrace + 0x7f
1: AudulusDebug32: abortHandler + 0x61
2: AudulusDebug32: _XcptFilter + 0x1e3
3: AudulusDebug32: __tmainCRTStartup + 0x15f
4: AudulusDebug32: WinMainCRTStartup + 0xd
5: BaseThreadInitThunk + 0xe
6: RtlInitializeExceptionChain + 0x84
7: RtlInitializeExceptionChain + 0x5a
Внутренне getStackBacktrace
выполняет следующие действия:
HANDLE process = GetCurrentProcess();
SymInitialize (process, nullptr, TRUE);
void* stack[128];
int frames = (int) CaptureStackBackTrace (0, numElementsInArray (stack), stack, nullptr);
Есть ли способ получить трассировку стека для потока, где произошел сбой (или все потоки)?
https://msdn.microsoft.com/en-us/library/windows/desktop/ms680634%28v=vs.85%29.aspx –
@HansPassant, тот же результат я боюсь. – Taylor
Не происходит в x64. Я не уверен, связано ли это с тем, что x86 использует исключения на основе стека, а не таблицы, или потому что WOW64 запутывает вещи. (У меня нет 32-битной машины, чтобы ее можно было попробовать.) –