2009-02-13 2 views
0

Я попытался сделать свою программу дампом и сохранить трассировку стека при сбоях. Я установил свой собственный обработчик 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 только повторяет тот же фрейм.

В чем проблема, и как исправить?

ответ

1

Это похоже на код, который у меня есть, и это действительно работает. Единственное различие, которое я вижу, заключается в том, что мой код использует ZeroMemory(), чтобы очистить структуру STACKFRAME64 до заполнения любых ее частей - это может потребоваться.

+0

И да, это была проблема. – Calmarius

+1

Вы можете сделать 'STACKFRAME64 sf64 = {0};' также обнулить его. –

Смежные вопросы