我正在使用 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;
}
到目前为止,这有效,并且 in 的值xp->ContextRecord->Eip
告诉我哪个函数导致了访问冲突(实际上 - ntdll.dll!RtlEnterCriticalSection ,EDX 的值告诉我这个函数是用一个虚假的参数调用的)。
但是,这个函数在很多地方都被调用,包括从其他 WinAPI 函数中调用,所以我仍然不知道哪个代码负责使用虚假参数调用这个函数。
是否有任何代码可以用于生成函数调用链的跟踪,该函数调用导致 EIP 现在所在的位置,基于信息EXCEPTION_POINTERS
或其他信息?(不能在外部调试器下运行程序)。
只需 EIP 值就可以了,因为我可以在链接器映射和符号表中查找它们,尽管如果有一种方法可以自动将它们映射到符号名称会更好。
我正在为这个项目使用 C++Builder 2006,尽管 MSVC++ 解决方案可能仍然有效。