我在 Windows 上有一个 c++ 程序,我想在其中提供完整的调用堆栈日志记录,以防出现错误(硬件、软件)。是否有可能实现这样的功能?这是包含外部 seh 处理程序的一小段代码:
__try
{
difficult_task();
}
__except(my_seh_filter(GetExceptionInformation()))
{
// How to print full backtrace of exception here?
}
我目前所知道的:
- Windows 提供的 DbgHelp.dll 允许您获取有关调用堆栈的信息(您可以打印堆栈)。
- SEH 异常处理允许您获取发生异常的上下文。(异常类型、异常地址、抛出异常时的处理器寄存器)。
有一个但是。我想直接在 seh 过滤器或相应的 catch 块中打印调用堆栈。而且我并不完全清楚如何使用这两个工具打印回溯(毕竟,它可能会在堆栈提升时发生变化)。当我在抛出异常的那一刻打印堆栈时,这是一回事。另一个是在处理时(我假设在处理异常时,我将不再拥有有关堆栈的完整信息)。
从 SEH 过滤器中取出调用堆栈的最简单方法是将指向由 GetExceptionInformation返回的上下文的指针传递给 StackWalk64函数。像这样的东西: