如何使VC++的调试器在异常发生时中断?

13

我正在尝试调试一个用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次,而这已经超出了我的技能(或者说是耐心),无法跟踪。

我想必定有一种方法可以让“第一次机会”异常实际上给我一个“机会”来处理它。可能有一些“立即在第一次机会异常时中断”的配置设置,但它似乎并不容易发现。

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

2个回答

17
Debug 菜单中选择 Exceptions 并选中您想让调试器中断的异常复选框。 "Access Violation" 位于 "Win32 Exceptions" 下方。

@Mason:没问题。我认为它们中没有任何一个默认选中。我猜当启用“异常中断”时,会有相当大的性能损失(虽然我不太确定)。 - James McNellis
我不这么认为。虽然我对C++不是很熟悉,但在Delphi中,性能惩罚为零,直到它在一个地方出现问题,而且当(如果)出现问题时,通常意味着出了什么问题,调试器正好在你想要的位置。 - Mason Wheeler
1
@Mason:我同意,我一直认为这是糟糕的默认行为。 - BlueRaja - Danny Pflughoeft
2
在MSVC 2015中,它似乎已经移到了Debug > Windows > Exception Settings下面。我花了很长时间才找到它! - s3cur3

1

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

继续James的回答,你要查找的异常在Win32异常部分下面。你应该会看到访问冲突(Access Violation)。


这个能行吗?这是一个“读取”错误,据我所知,数据断点只有在您更改有问题的地址处的值时才会触发。 - Mason Wheeler
当执行到特定位置时,您也可以中断(我认为这只是断点属性对话框上的一个选项)。 - Mark Ingram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接