gpt4 book ai didi

delphi - 如何追踪访问冲突 "at address 00000000"

转载 作者:行者123 更新时间:2023-12-03 14:33:33 24 4
gpt4 key购买 nike

当错误消息包含实际地址时,我知道如何创建 .map 文件来跟踪访问冲突错误。

但是如果错误消息显示怎么办

Access violation at address 00000000. Read of address 00000000.

我从哪里开始寻找这个问题的原因......?

最佳答案

接受的答案并不能说明整个故事。

是的,每当你看到零时,就涉及到一个NULL指针。这是因为NULL根据定义为零。因此,调用零 NULL 可能没什么意义。

您收到的消息有趣之处在于,NULL 被提及两次。事实上,您报告的消息看起来有点像 Windows 品牌操作系统向用户显示的消息。

该消息显示地址 NULL 尝试读取 NULL。那么这意味着什么呢?具体来说,地址如何读取自身?

我们通常会想到某个地址处的指令从某些地址的内存中读取和写入。知道这一点可以让我们解析错误消息。该消息试图阐明 地址 NULL 处的指令尝试读取 NULL

当然,地址NULL处没有指令,这就是为什么我们认为NULL在我们的代码中是特殊的。但每条指令都可以被认为是从尝试阅读自身开始的。如果 CPU EIP 寄存器位于地址 NULL,则 CPU 将尝试从地址 0x00000000 ( NULL)。尝试读取 NULL 将失败,并生成您收到的消息。

在调试器中,当您收到此消息时,请注意 EIP 等于 0x00000000。这证实了我给您的描述。

问题就变成了,“为什么我的程序试图执行NULL地址。”我想到了三种可能性:

  • 您尝试通过已声明的函数指针进行函数调用,该函数指针已分配给NULL,从未以其他方式初始化,并且正在取消引用。
  • 同样,您可能正在调用一个“抽象”C++ 方法,该方法在对象的 vtable 中有一个 NULL 条目。这些是在您的代码中使用语法 virtual function_name()=0 创建的。
  • 在您的代码中,写入零时堆栈缓冲区已溢出。这些零已被写入到堆栈缓冲区末尾之外、保留的返回地址上。当函数稍后执行其 ret 指令时,将从覆盖的内存位置加载值 0x00000000 (NULL)。这种类型的错误(堆栈溢出)是我们论坛的同名错误。

既然您提到您正在调用第三方库,我将指出,这可能是该库期望您提供非NULL函数指针作为某些函数的输入的情况API。这些有时称为“回调”函数。

您将不得不使用调试器来进一步缩小问题的原因,但上述可能性应该可以帮助您解决这个谜题。

关于delphi - 如何追踪访问冲突 "at address 00000000",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2237028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com