在Visual Studio 2008中开发的我的c ++应用程序在某些内存位置崩溃。它显示内存访问违规错误,如, XXX.exe中0x650514aa处的未处理异常:0xC0000005:访问冲突读取位置0x00000004。
如何将变量名称分配给0x650514aa这个内存位置。或者如何调试此问题。
谢谢, Nilesh制作
答案 0 :(得分:3)
0x650514aa
是代码(指令指针)的地址,而不是变量的地址。如果你很幸运,那就是你的代码。然后一个地图文件会有所帮助。如果你运气不好,那就是一些第三方代码(因为你称它为胡言乱语)。但是挖掘地图文件并不是很好,它也不会告诉你变量的值。
但是,如果从调试器运行它,调试器应该拦截并让您检查堆栈。即使您在没有调试器的情况下运行它,实时调试也会弹出一个对话框,询问您是否要附加调试器。
答案 1 :(得分:2)
这里的其他答案都有有用的信息。但是如果由于某种原因你无法让调试器来帮助你,那么你可以从错误信息中找到更多细节,这可能有助于你找到问题。
访问冲突读取位置0x00000004。
该内存位置是程序错误地尝试读取的内容。通常,读取或写入非常低的内存位置是由尝试使用NULL指针的代码引起的,就像它指向有效对象一样。
如果您碰巧大致知道发生此错误时程序的哪个部分正在执行,那么请检查它是否有任何可能导致NULL指针意外滑过。
此外,0x00000004将是从对象的开头起4个字节的成员变量的位置。如果对象具有虚函数,则它可能是对象中的第一个成员变量(因为前4个字节是指向虚函数表的隐藏指针)。否则,如果不涉及虚函数,则必须有4个字节的其他成员变量和/或填充字节。因此,如果你不能立即告诉哪个指针是NULL并导致问题,那么考虑使用哪些指针来读取这样的成员变量。
(注意:从技术上讲,非POD对象的确切内存布局,特别是涉及虚拟函数时,并不能保证任何标准。项目中的字节对齐设置也会影响内存布局。但是,在这种情况下,它是可以相当安全地假设我所描述的是你的编译器实际上正在做的事情。)
答案 2 :(得分:1)
通常,如果在Visual Studio 2008中调试应用程序,则在崩溃时它将停在违规行。确保在Debug配置中编译,然后单击 Debug |开始
如需进一步检查,您可以转到调试|例外并选中“抛出异常时中断”框。
答案 3 :(得分:0)
如果您正在调试中运行,那么您应该能够让系统中断并能够查看源代码。
但是,如果您在发布模式下运行,则可能需要使用可生成的.map文件。 (链接开关/ MAP,您还需要指定导出文件)
这里有关于如何使用v6的说明:http://www.codeproject.com/KB/debug/mapfile.aspx
我相信,2008年是非常相似的,尽管我倾向于在可能的情况下以调试模式运行。地图文件允许您将崩溃地址转换为源代码中的确切位置(行号),这可能会有所帮助。但是,它只会告诉您错误表现在哪里 - 而不是实际导致它的原因(例如,只有在发现损坏的堆栈时,堆栈损坏才会告诉您何时损坏堆栈。)
不过,它应该有助于指明你正确的方向。