Delphi 对地址处的访问冲突进行故障排除。读取地址00000000

Delphi 对地址处的访问冲突进行故障排除。读取地址00000000,delphi,delphi-7,access-violation,Delphi,Delphi 7,Access Violation,同一版本的Delphi 7代码已部署在我们整个组织的计算机上 每次用户A访问计算机F1上的记录Z时,都会显示以下错误: Access violation at address 00642E83 in module 'foo.exe'. Read of address 00000000 我在自己的计算机上使用我的用户,在另一台计算机上使用另一个人的用户,执行了相同的步骤,但无法复制它(因此,无法调试…) 根据要求提供附加信息(不确定这会有多大帮助) 记录Z是Interbase DB中的一行,其

同一版本的Delphi 7代码已部署在我们整个组织的计算机上

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

Access violation at address 00642E83 in module 'foo.exe'. Read of address 00000000
我在自己的计算机上使用我的用户,在另一台计算机上使用另一个人的用户,执行了相同的步骤,但无法复制它(因此,无法调试…)

根据要求提供附加信息(不确定这会有多大帮助)

  • 记录Z是Interbase DB中的一行,其中保存了来电人员的联系和通话历史记录
  • 我们组织中的所有计算机都使用相同版本的Windows 7
所以当

  • 用户B访问计算机F2上的记录Z没有错误
  • 用户C访问计算机F3上的记录Z没有错误
  • 用户A访问计算机F4上的记录Z没有错误
  • 用户A访问计算机F1上的记录Z(重新启动后)在所述的相同地址处出现相同错误
看来F1电脑是罪魁祸首。 然而,在这一点上,我不知道如何进一步排除故障


有什么建议吗?

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

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

访问冲突at像00642E83这样的地址(进程空间中的某个数字,而不是像00000000或FFFFF8这样的数字)意味着它是数据访问。如果您在地址空间的一个或另一个极端处获取了该值的数字,则表示您试图跳转到无效的代码地址;如果您试图对仍然为
nil
的对象调用虚方法,通常会发生这种情况

评论中“500-内部服务器错误”给出的建议可能不会有帮助,因为加载内容的地址空间在不同的系统之间并不总是一致的,但他走在了正确的轨道上

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

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


Delphi最常见的错误日志记录工具是和。我已经使用过这两种方法(EurekaLog在专业工作中使用过,Madag在个人开发中除外),我会向任何需要错误记录器的Delphi开发人员推荐这两种方法。你需要做的是用这两个工具中的一个重建你的项目,将它发送给拥有导致事情不正常的计算机的客户,并告诉他们重现错误,并将它生成的错误报告发回给你。这将为您提供追踪bug所需的信息。

我认为完全不可能回答这个问题。@AndreasRejbrand-我的陈述中是否缺少了可以改变“完全不可能”的信息?您应该告诉我们,例如,什么样的“记录”
Z
,以及如何“访问”。您还应该告诉我们计算机
F1
(不同的操作系统?)的特殊之处。但即便如此,我怀疑我们能做的远不止猜测。只有您才能获得代码。@AU_Outpost:在IDE中单步进入您的应用程序,切换到CPU窗口,然后右键单击并选择Go to Address,然后从异常中输入地址。这至少可以让你知道错误发生在代码的什么地方。对不起。我不明白。你能消除所有的“用户A,记录Z,计算机F1”噪音并实际解释问题吗?什么是“记录Z”?它是数据库中的一行吗?Delphi类型(
Z=record
)?“访问”是什么意思?从我们的角度来看,你所发布的一切都是毫无意义的。如果你想在这里得到帮助,你需要提供人们能够理解的信息;我们无法读懂你的心思,所以你的话必须向我们提供信息。全零地址表示您试图在应用程序
foo.exe
中使用零指针。这里没有其他有用的信息。谢谢@Mason!我不知道如何从这里调试它,因为代码很古老(15年以上,0个文档)。对于如何进一步排除故障,您给了我一个很好的指导!作为比较,我们公司使用的软件自Delphi 1发布以来就已经存在,包括16个不同的Delphi项目(EXE和DLL以及一个包),总共大约有1000万行代码。如果我们在追踪访问违规行为方面没有问题,对您来说肯定会更容易。玛德琳是我们的首选。