【问题标题】:How do I make VC++'s debugger break on exceptions?如何使 VC++ 的调试器因异常而中断?
【发布时间】:2010-04-15 05:19:31
【问题描述】:

我正在尝试调试用 C 编写的 DLL 中的一个问题,该问题不断导致访问冲突。我使用的是 Visual C++ 2008,但代码是纯 C。

我习惯了 Delphi,如果在调试器下运行时发生异常,程序会立即中断到调试器,它会给你一个检查程序状态的机会。但是,在 Visual C++ 中,我得到的只是“输出”选项卡中的一条消息:

First-chance exception at blah blah blah: Access violation reading location 0x04410000. 没有休息,什么都没有。它只是去展开堆栈,直到它回到我的 Delphi EXE 中,它会识别出问题并在那里提醒我,但到那时我已经丢失了几层调用堆栈,我不知道发生了什么。

我尝试过其他调试技术,但无论它在做什么都发生在一个 C 宏内的嵌套循环深处,该宏被调用超过 500 次,这有点超出我的技能(或我的耐心)来追踪通过。

我认为必须有某种方法来获得“第一次机会”异常,才能真正给我一个“机会”来处理它。可能有一些我不知道的“在第一次机会异常时立即中断”配置设置,但它似乎并不是那么容易被发现。

有谁知道它在哪里以及如何启用它?

【问题讨论】:

    标签: c visual-c++ debugging exception visual-c++-2008


    【解决方案1】:

    从 Debug 菜单中,选择 Exceptions 并选中您希望调试器中断的异常对应的复选框。 “访问冲突”位于“Win32 异常”下。

    【讨论】:

    • @Mason:没问题。我认为默认情况下不会检查任何一个。我的猜测是,启用“异常中断”时会有相当大的性能损失(尽管我真的不知道)。
    • 我不这么认为。我不太了解 C++,但是在 Delphi 中,性能损失为零,直到它实际中断一个,并且当(如果)它确实发生时,这通常意味着出现问题并且调试器正是你想要的地方是。
    • @Mason:我同意,我一直认为这是糟糕的默认行为。
    • 看起来在 MSVC 2015 中这已经转移到隐藏在 Debug > Windows > Exception Settings 下。我花了很长时间才找到它!
    【解决方案2】:

    您还可以使用“First-chance exception at...”行中指定的地址创建数据断点。

    根据 James 的回答,您要查找的异常位于 Win32 异常部分的下方。您应该在那里看到访问冲突。

    【讨论】:

    • 这行得通吗?这是“读取”错误,仅当您更改相关地址的值时,AFAIK 数据断点才会关闭。
    • 您也可以在执行到达特定位置时中断(我认为这只是断点属性对话框中的一个选项)。
    猜你喜欢
    • 1970-01-01
    • 2013-08-07
    • 2020-03-02
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 2020-04-04
    相关资源
    最近更新 更多