【发布时间】:2016-08-01 19:21:06
【问题描述】:
有没有办法捕获常规 C++ 异常并为其获取 CONTEXT object,这样我们就可以遍历堆栈并获取回溯,而无需诉诸 __try 和 __except 短语?
更新:虽然我了解如何设置和使用未处理的异常过滤器,但我真的希望使用 try..catch 处理这些异常并获得堆栈跟踪,而无需进入线程的顶层。
【问题讨论】:
-
很遗憾,没有办法。 C++ 异常对堆栈跟踪不友好。
-
走堆栈听起来很有趣,但实际上几乎没有用处。设置一个未处理的异常过滤器,并改为编写一个小型转储。异常过滤器带有一个EXCEPTION_POINTERS 结构,可以写入转储文件并读回调试器。 @Ajay:C++ 异常是 SEH 异常(反正由 VS 实现)。是什么让它们“对堆栈跟踪不友好”?
-
@IInspectable,没有 C++ 异常不是 SEH。尝试在调用堆栈深处抛出一个 C++ 对象,看看是否可以将它追踪到抛出它的函数。
__try和__except语句从不捕获 C++ 异常。但是,使用编译器标志,C++ 异常处理程序可以同时处理 SEH 和 C++。此外,您不能在同一函数中使用__try(SEH) 和try(C++)。 -
@Ajay:无论如何,我刚刚实现了一个测试应用程序,Visual Studio 2015,64 位,在 Windows 10 上运行。由单行代码组成:
throw 42;。单步进入程序集并在RaiseException 结束。我不知道您为什么坚持认为 C++ 异常不会在 SEH 异常之上实现。 Visual Studio 一直都是这样做的。 -
@Ajay:负责随 Visual Studio 提供的 CRT 的人员显示为 agree with me。你为什么不去告诉他,他错了?把它排除在外,带着所有过分的尊重,让它休息一下。你错了。习惯它,它经常发生。
标签: windows winapi exception visual-c++ exception-handling