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

AU_*_*ost -2 delphi delphi-7 access-violation

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

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

Access violation at address 00642E83 in module 'foo.exe'. Read of address 00000000
Run Code Online (Sandbox Code Playgroud)

我和我的用户在我自己的计算机上执行了相同的步骤,并且在另一台计算机上跟另一个人的用户执行了相同的步骤,并且无法复制它(因此无法调试...).

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

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

那么......

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

计算机F1似乎是罪魁祸首.但是,此时,我不确定如何进一步排除故障.

有什么建议?

Mas*_*ler 10

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

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

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

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

如果您无法在调试器中重现它,但它始终在某个系统上重现,则需要从该系统获取有用的调试信息.有两种方法可以执行此操作:在其系统上附加调试器(在大多数情况下不太可行)或使用错误记录器.

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

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

  • 作为对比,我们公司使用的软件自Delphi 1发布以来就已经存在,包括16个不同的Delphi项目(EXE和DLL和一个包),总计大约1000万行代码.如果我们跟踪访问冲突没有问题,那对您来说肯定会更容易.MadExcept是我们的首选记录器. (2认同)