解决地址访问冲突问题。读取地址00000000

时间:2013-04-03 21:16:04

标签: delphi delphi-7 access-violation

在整个组织的计算机上部署了相同版本的Delphi 7 Code。

每次用户A访问计算机F1上的记录Z时,都会显示以下错误:

Access violation at address 00642E83 in module 'foo.exe'. Read of address 00000000

我在我自己的计算机上跟我的用户一样,在另一台计算机上跟另一个人的用户一样,并且无法复制它(因此无法调试......)。

根据要求提供其他信息(不确定这将有多大帮助)

  • 记录Z是Interbase数据库中的一行,其中包含已呼入的人员的联系人和呼叫历史记录。
  • 我们组织中的所有计算机都使用相同版本的Windows 7。

所以当...

  • 用户B在计算机F2上访问记录Z,没有错误。
  • 用户C访问计算机F3上的记录Z,没有错误。
  • 用户A访问计算机F4上的记录Z没有错误。
  • 用户A访问计算机F1上的记录Z(重新启动后),在提到的相同地址存在相同的错误。

计算机F1似乎是罪魁祸首。 但是,在这一点上,我不确定如何进一步排除故障。

有什么建议吗?

1 个答案:

答案 0 :(得分:10)

目前,没有足够的信息供我们调试。但是足以给你一些有用的线索:

访问冲突,读取地址00000000,意味着有人试图取消引用空指针。这通常是(但不总是)尚未构建的对象。

访问违规地址(如00642E83)(进程空间中的某个数字,而不是00000000或FFFFFFF8)表示它是数据访问。如果你在这个值的地址空间的一个或另一个极端得到一个数字,那表示你试图跳转到无效的代码地址;如果您尝试在仍为nil的对象上调用虚方法,则通常会发生这种情况。

评论中“500 - 内部服务器错误”给出的建议可能无济于事,因为事物被加载到的地址空间并不总是从一个系统到另一个系统是一致的,但他是在正确的轨道上。 / p>

如果您无法在调试器中重现它,但它在某个系统上始终如一地重现,则需要从该系统获取有用的调试信息。有两种方法可以做到这一点:在他们的系统上附加调试器(在大多数情况下不是很可行)或使用错误记录器。

错误记录器在现代开发中是一个非常有用的工具,我建议将其用于任何将要部署到您无法控制的计算机上的产品。基本上,它会在程序中安装一些额外的代码,以捕获未处理的异常并生成错误报告以发回给您。该报告通常包含各种有用的信息,包括一个完整的堆栈跟踪。当您有其中一个时,访问冲突通常很容易追踪和解决。

Delphi最常见的错误记录工具是EurekaLogMadExcept。我已经使用过(专业工作中的EurekaLog和个人开发的MadExcept),我会向任何需要错误记录器的Delphi开发人员推荐一个。您需要做的是使用这两个工具中的一个重建项目,将其发送给具有导致行为异常的计算机的客户端,并告诉他们重现错误并将其生成的错误报告发回给您。这应该为您提供追踪错误所需的信息。