Visual Studio - 查找用户代码中发生未处理异常的位置

时间:2013-06-15 12:34:30

标签: c++ visual-studio

在多线程项目中,我遇到了一些未处理的异常:

0xC0000005: access violation at 0x00000000

,箭头指向qstring.h的某一行。我不知道我的代码的哪一行导致了这种违规行为。

如何在我的代码中找到访问冲突的位置?

enter image description here

这是call stack吗?我真的无法理解这一点。

2 个答案:

答案 0 :(得分:4)

转到“调试”菜单,“例外”。

在此对话框中,勾选要捕获的异常(编辑:访问冲突将在Win32部分。您可以浏览异常的树结构或只需单击查找按名称搜索)

现在在调试器下运行你的代码,并且只要抛出异常,vs就会中断。

现在打开调用堆栈(Debug> Window> Call Stack)以查看导致问题的函数。您可以双击调用堆栈中的任何行来跳转到代码并在调试器中查看该方法的变量值。搜索堆栈,直到找到程序正在执行的您的代码中的最后一个方法。

在许多情况下,问题在这一点上显而易见(例如,一个null的变量),但它可能是在其他地方设置的状态,它通过该方法导致崩溃(例如,您要传递给库调用的struct,在这种情况下,您必须查看更远的地方以找出设置null值的时间和位置。这可能是调用堆栈的进一步上升,或者它可能是在完全不同的方法中很久以前设置的状态 - 但是在崩溃之前立即查找代码正在执行的操作将为您提供关于在哪里查看的大量线索找到问题的根源。

如果您可以识别导致访问冲突的数据值,那么您可以添加条件断点(例如,在该内存位置更改时),以便您可以捕获错误设置值的点。另一种方法是使用访问器方法来设置值,以便您可以断开它们并逐步执行代码,直到找到将不正确的值设置到其中的调用。或者你可能只需要检查代码中的逻辑缺陷。

答案 1 :(得分:2)

查看Visual Studio中的Call Stack窗口。

虽然Visual Studio通常显示引发异常的线程的调用堆栈(并且通常足以跟踪错误),但查看其他线程(在Threads中双击它们)可能很有用。窗格)知道他们在那个时间点做了什么。