有没有办法捕获常规的C ++异常并为它获取CONTEXT object,所以我们可以在不使用__try和__except短语的情况下遍历堆栈并获得回溯?
更新:虽然我理解如何设置和使用未处理的异常过滤器,但我真的希望用try..catch处理这些异常,并获得堆栈跟踪而不必转到线程的顶层。
答案 0 :(得分:1)
没有,优化的C ++编译器不需要保持CONTEXT,有效地复制堆栈,所以当我们进入catch时它已经消失了。但是,当抛出异常时,您可以通过附加到Debug事件和Accessing Thread Context Information from Threads of a Process Being Debugged轻松获取堆栈跟踪。
也许它可以以某种方式完成,因为上下文保存在Unwind Procedure的开头,我们可以尝试分析类似于Crash Course on the Depths of Win32™ Structured Exception Handling的堆栈,有效地使用PBP和偏移,可能需要启用SEH。但是,异常处理的内部细节在不同版本,平台和编译器设置之间已经发生了变化,因此这是一种相当脆弱的方法,SEH的使用是discouraged for C++:
结构化异常处理(C / C ++)(Visual Studio 2015)
Windows和Visual C ++支持结构化异常处理(SEH),我们 建议您使用ISO标准C ++异常处理,因为它 使代码更加便携和灵活。然而,在现有的代码中 或者对于特定类型的程序,您仍可能需要使用SEH。