Как создать трассировку стека из исключения SEH

Я ловлю исключение, используя Win32 SEH:

try
{
// illegal operation that causes access violation
}
__except( seh_filter_func(GetExceptionInformation()) )
{
// abort
}

где функция фильтра выглядит так:

int seh_filter_func(EXCEPTION_POINTERS *xp)
{
// log EIP, other registers etc. to file

return 1;
}

Это работает до сих пор, и значение в xp->ContextRecord->Eip говорит мне, какая функция вызвала нарушение доступа (на самом деле — ntdll.dll! RtlEnterCriticalSection, а значение для EDX говорит мне, что эта функция была вызвана с поддельным аргументом).

Однако эта функция вызывается во многих местах, в том числе из других функций WinAPI, поэтому я до сих пор не знаю, какой код отвечает за вызов этой функции с помощью фиктивного аргумента.

Есть ли какой-нибудь код, который я могу использовать, чтобы сгенерировать трассировку цепочки вызовов функций, ведущих к тому, где сейчас находится EIP, на основе информации в EXCEPTION_POINTERS или иным образом? (Запуск программы под внешним отладчиком не вариант).

Только значения EIP будут в порядке, так как я могу найти их в карте компоновки и в таблицах символов, хотя, если есть способ автоматически сопоставить их с именами символов, это было бы еще лучше.

Я использую C ++ Builder 2006 для этого проекта, хотя решение MSVC ++ может работать в любом случае.

4

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]