Почему StackWalk64 всегда возвращает true? - PullRequest
0 голосов
/ 13 февраля 2009

Я попытался сделать дамп своей программы и сохранить трассировку стека при сбоях. Я установил свой собственный обработчик win32 SE с помощью _set_se_translator и попытался сбросить трассировку стека с помощью StackWalk64 и, наконец, выдать исключение C ++ (которое фактически делает запись при обнаружении).

Код выглядит так:

...
_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 всегда возвращает true, и цикл while становится бесконечным. StackWalk64 повторяет только один и тот же кадр.

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

1 Ответ

1 голос
/ 13 февраля 2009

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

...