6

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

4

1 回答 1

0

我认为您可以为此使用Boost.Stacktrace :

#include <boost/stacktrace.hpp>

int seh_filter_func(EXCEPTION_POINTERS *xp)
{
    const auto stack = to_string( boost::stacktrace::stacktrace() );
    LOG( "%s", stack.c_str() );

    return 1;
}
于 2021-12-11T16:54:57.043 回答