我使用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函数,因此我仍然不知道哪个代码负责使用伪造的参数调用此函数。
根据EXCEPTION_POINTERS
中的信息或其他方式,是否有任何代码可用于生成导致EIP现在的函数调用链的跟踪? (在外部调试器下运行程序不是一种选择)。
只是EIP值可以,因为我可以在链接器映射和符号表中查找它们,但是如果有办法自动将它们映射到符号名称甚至更好。
我正在为这个项目使用C ++ Builder 2006,尽管MSVC ++解决方案可能仍在使用。