【问题标题】:Debugger main loop调试器主循环
【发布时间】:2011-08-17 17:43:45
【问题描述】:

我正在尝试在 c++/Windows 中实现本文中描述的“调试器主循环”:Writing the Debugger's Main Loop

但我希望任何抛出的异常都能在屏幕上显示错误消息并被调试器捕获。 我知道我可以通过给ContinueDebugEvent 一些 DBG_ 值来做到这一点???但我不知道它是什么。
这个值是多少?

我还注意到,当向控制台写入内容时,控制台应用程序会通知调试器异常。 如何从这些事情中过滤出实际的异常?它与“第一次机会”价值有什么关系吗?
谢谢:)

【问题讨论】:

  • 我不明白你的问题。您的应用程序是调试器,因此您是必须显示错误消息的人。
  • 这样说吧:如果我调试的应用程序将一个数字除以0,我希望它崩溃! :)
  • 将 DBG_EXCEPTION_NOT_HANDLED 传递给 ContinueDebugEvent;这告诉系统让进程继续其正常的异常处理机制(例如,您的调试器没有处理异常)。如果是第二次机会异常,则系统将终止该进程。
  • 好的,但是即使它发送通知,因为某些内容已打印到屏幕上,该进程也会终止。是否有办法只过滤致命异常?
  • 呃。显然文件不正确;您需要为 OUTPUT_DEBUG_STRING_EVENT 传递 DBG_CONTINUE。 maximumcrack.wordpress.com/2009/06/22/…

标签: c++ windows exception debugging


【解决方案1】:

调试器会为被调试对象中发生的每个异常接收一个异常事件。 如果您将DBG_CONTINUE 传递给ContinueDebugEvent,调试器会吞下异常并继续执行,就好像一开始就没有发生异常一样。这意味着也不会通知被调试者。 另一方面,如果您传递了DBG_EXCEPTION_NOT_HANDLED,则通知被调试对象并负责处理异常。

现在,如果被调试对象处理(读取:捕获)异常,调试器会第二次收到通知,这次将 Event.u.Exception.dwFirstChance 设置为 0。此时异常将如果通过DBG_EXCEPTION_NOT_HANDLED,则终止进程。

要记住两件事:

  • 将字符串传递给调试器的正常方式是OutputDebugString。除非您需要传递字符串以外的内容,否则无需使用自定义异常。
  • 如果您确实计划抛出自己的异常以将某些事件传达给调试器,请检查 Event.u.Exception.ExceptionRecord.ExceptionCode 并查看它是否与您预定义的异常类型匹配,并在这种情况下使用 DBG_CONTINUE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 2015-05-21
    • 2022-06-16
    • 2018-06-14
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    相关资源
    最近更新 更多