我知道如何创建 .map 文件来在错误消息包含实际地址时跟踪访问冲突错误。
但是如果错误消息说怎么办
Access violation at address 00000000. Read of address 00000000.
我从哪里开始寻找这个问题的原因......?
接受的答案并不能说明整个故事。
是的,每当你看到零时,NULL
涉及到指针。那是因为NULL
is 根据定义零。所以称零NULL
可能不多说。
What is您收到的消息有趣的是NULL
被提到twice。事实上,您报告的消息看起来有点像 Windows 品牌操作系统向用户显示的消息。
该消息称address NULL
试着read NULL
。那么这是什么意思呢?具体来说,地址如何读取自身?
我们通常认为指令在某个地址上从某些地址的内存中读取和写入。知道这一点可以让我们解析错误消息。该消息试图阐明操作说明 at address NULL
试着read NULL
.
当然,地址处没有指令NULL
,这就是为什么我们想到NULL
在我们的代码中很特别。但每条指令都可以被认为是从尝试阅读自身开始的。如果 CPUEIP
寄存器位于地址NULL
,然后CPU将尝试读取opcode对于来自地址 0x00000000 的指令(NULL
)。这次尝试阅读NULL
将失败,并生成您收到的消息。
在调试器中,请注意EIP
当您收到此消息时,等于 0x00000000。这证实了我给你的描述。
那么问题就变成了,“为什么我的程序试图执行NULL
地址。”我想到了三种可能性:
- 您尝试通过已声明并分配给的函数指针进行函数调用
NULL
,否则从未初始化,并且正在取消引用。
- 类似地,您可能正在调用一个“抽象”C++ 方法,该方法具有
NULL
对象的 vtable 中的条目。这些是在您的代码中使用语法创建的virtual function_name()=0
.
- 在您的代码中,写入零时堆栈缓冲区已溢出。这些零已被写入到堆栈缓冲区末尾之外、保留的返回地址上。当该函数稍后执行其
ret
指令,值 0x00000000 (NULL
)从被覆盖的内存点加载。此类错误(堆栈溢出)是我们论坛的同名错误。
既然你提到你正在调用第三方库,我会指出这可能是图书馆希望你提供非-NULL
函数指针作为某些 API 的输入。这些有时被称为“回调”功能。
您将不得不使用调试器来进一步缩小问题的原因,但上述可能性应该可以帮助您解决这个难题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)