-2

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

用户 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 是罪魁祸首。但是,此时,我不确定如何进一步排除故障。

有什么建议么?

4

1 回答 1

10

目前,没有足够的信息让我们对此进行调试。但足以给你一些有用的线索:

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

像 00642E83(进程空间中的某个数字,而不是像 00000000 或 FFFFFFF8 这样的地址)这样的地址的访问冲突意味着它是数据访问。如果你在这个值的地址空间的一个或另一个极端得到了一个数字,这表明你试图跳转到一个无效的代码地址;如果您尝试在仍然nil.

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

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

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

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

于 2013-04-03T21:35:27.777 回答