Я ловлю исключение, используя 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 ++ может работать в любом случае.
Задача ещё не решена.