1

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

0xC0000005: access violation at 0x00000000

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

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

在此处输入图像描述

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

4

2 回答 2

4

转到调试菜单,异常。

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

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

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

在许多情况下,此时问题将非常明显(例如,一个为 null 的变量),但它可能是在其他地方设置的状态通过该方法导致崩溃(例如,您的结构中的 null正在传递给库调用),在这种情况下,您将不得不在更远的地方寻找空值的设置时间和位置。这可能在调用堆栈的更深处,或者它可能是很久以前以完全不同的方法设置的状态 - 但是在崩溃前立即找到您的代码正在执行的操作将为您提供很多关于在哪里查看的线索找到问题的根源。

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

于 2013-06-15T12:42:14.080 回答
2

查看Call StackVisual Studio 中的窗口。

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

于 2013-06-15T12:37:43.767 回答