2010-07-07 65 views
0

在Visual Studio 2008中开发的我的C++应用程序在某些内存位置崩溃。它显示内存访问冲突erroe像, XXX.exe中的0x650514aa未处理的异常:0xC0000005:访问冲突读取位置0x00000004。Visual Studio 2008中的内存地址的变量名称

我如何获得分配给0x650514aa这个内存位置的变量名。或者如何调试这个问题。

感谢, Nilesh制作

回答

1

通常,如果你调试的Visual Studio 2008中您的应用程序,在崩溃的时候就会停止就在违规线。一定要在Debug配置中进行编译,然后单击Debug |开始

要进一步检查,您可以去调试|异常并选中“抛出异常时中断”框。

3

0x650514aa是代码(指令指针)的地址,而不是变量的地址。如果你幸运的话,那就是你的代码。然后一个地图文件会有所帮助。如果你不走运,那是一些第三方代码(因为你称之为废话)。但是挖掘地图文件并不是很好,无论如何它都不会告诉你变量的值。

但是,如果您从调试器运行它,调试器应拦截并让您检查堆栈。即使你在没有调试器的情况下运行它,即时调试应该会弹出一个对话框,询问你是否要附加一个调试器。

0

如果您正在运行调试,那么您应该能够让系统在此时中断并能够看到源代码。

但是,如果您在发布模式下运行,则可能需要使用可生成的.map文件。 (链路切换/ MAP,和你需要太指定导出文件)

有一个如何为V6这里的描述:http://www.codeproject.com/KB/debug/mapfile.aspx

2008是非常相似的,我相信,虽然我倾向于选择如果可能的话,以调试模式运行。

映射文件将允许您将您的崩溃地址转换为源代码(行号)中的确切位置,这可能很有帮助。但是它只会告诉你错误在哪里出现 - 而不是实际造成的结果(例如,当损坏堆栈时,堆栈损坏不会告诉你,只有当发现损坏的堆栈时才会显示。)

不过,它应该帮助指出你在正确的方向。

2

这里的其他答案有用的信息。但是,如果由于某种原因,您无法让调试器为您提供帮助,那么可以从中找出更多详细信息,以帮助您找出问题所在。

访问冲突读取位置0x00000004。

该内存位置是程序错误地尝试读取的内容。通常,读取或写入像这样的非常低的内存位置是由尝试使用NULL指针的代码引起的,就好像它指向了有效的对象一样。

如果您碰巧知道您的程序在发生此错误时正在执行哪些部分,请检查它是否有任何可能的空指针意外跳过。

此外,0x00000004将是从对象的开始4个字节的成员变量的位置。如果对象具有虚函数,那么它可能是对象中的第一个成员变量(因为前4个字节是隐藏的指向虚函数表的指针)。否则,如果没有涉及虚函数,那么在它之前必须有4个字节的其他成员变量和/或填充字节。所以,如果你不能立刻知道哪个指针正在变为NULL并导致问题,那么就要考虑哪些指针正被用来读取这样的成员变量。 (注意:从技术上讲,非POD对象的确切内存布局,特别是涉及虚拟函数的情况,不能由任何标准保证,项目中的字节对齐设置也会影响内存布局,但在这种情况下假设我所描述的是你的编译器实际上在做什么是相当安全的。)

+0

你确定读取0x00000004是从对象的开始读取,而不是从进程的虚拟内存的开始读取? – fabspro 2012-06-07 09:27:19

相关问题