如何获得C ++异常的CONTEXT?

时间:2016-04-11 14:44:03

标签: windows winapi exception visual-c++ exception-handling

有没有办法捕获常规的C ++异常并为它获取CONTEXT object,所以我们可以在不使用__try和__except短语的情况下遍历堆栈并获得回溯?

更新:虽然我理解如何设置和使用未处理的异常过滤器,但我真的希望用try..catch处理这些异常,并获得堆栈跟踪而不必转到线程的顶层。

1 个答案:

答案 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。