Я попытался сделать свою программу дампом и сохранить трассировку стека при сбоях. Я установил свой собственный обработчик SEW Win32 с _set_se_translator
и попытался сбросить трассировку стека с StackWalk64
и, наконец, выбросить исключение C++ (которое фактически выполняет регистрацию при захвате).Почему возврат StackWalk64 всегда верен?
код выглядит следующим образом:
...
_set_se_handlers(WIN32EXCEPTION::Win32ExceptionStuff);
...
void WIN32EXCEPTION::Win32ExceptionStuff(unsigned int Code, struct _EXCEPTION_POINTERS* Info) // static
{
STACKFRAME64 sf64;
sf64.AddrPC.Offset = Info->ContextRecord->Eip;
sf64.AddrStack.Offset = Info->ContextRecord->Esp;
sf64.AddrFrame.Offset = Info->ContextRecord->Ebp;
sf64.AddrPC.Mode= sf64.AddrStack.Mode= sf64.AddrFrame.Mode= AddrModeFlat;
while (StackWalk64(IMAGE_FILE_MACHINE_I386,GetCurrentProcess(),GetCurrentThread(),
&sf64,Info->ContextRecord,0,SymFunctionTableAccess64,SymGetModuleBase64,0))
{
//... Do something with the stack frames
}
throw WIN32EXCEPTION(/*...*/);
}
, как я видел в некоторых примерах, но есть проблема: StackWalk64 всегда возвращает истину, и что while
цикл становится бесконечным. StackWalk64 только повторяет тот же фрейм.
В чем проблема, и как исправить?
И да, это была проблема. – Calmarius
Вы можете сделать 'STACKFRAME64 sf64 = {0};' также обнулить его. –