我正在使用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++解决方案可能仍然可行。