【问题标题】:How to get CONTEXT for a C++ exception?如何获取 C++ 异常的 CONTEXT?
【发布时间】: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


【解决方案1】:

,优化的 C++ 编译器不需要保留 CONTEXT,实际上是堆栈的副本。因此,当我们在渔获物内时,它可能已经消失了。但是,您可以通过在抛出异常时附加到 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。

【讨论】:

    猜你喜欢
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 2018-09-11
    • 1970-01-01
    • 2020-03-26
    • 2015-04-12
    相关资源
    最近更新 更多