2013-04-03 397 views
-2

Delphi 7 Code的相同版本已在我们组织的计算机上部署。在地址处解决访问冲突问题。地址读取00000000

每次用户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

我相信完全不可能回答这个问题。 – 2013-04-03 21:16:56

+0

@AndreasRejbrand - 在我的声明中是否有信息会改变“完全不可能”? – 2013-04-03 21:18:39

+0

你应该告诉我们,例如,'Z'是什么样的'记录',以及它是如何'访问'的。你还应该告诉我们计算机“F1”(一个不同的操作系统?)的特殊之处。但即使如此,我怀疑我们能做得比猜想还多。只有你得到了代码。 – 2013-04-03 21:20:57

回答

9

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

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

访问冲突像00642E83地址(在这个过程中的空间一批地方,而不是像00000000或FFFFFFF8)表示,这是数据访问。如果你在这个值的地址空间的某个或另一个极端获得了一个数字,那就表明你试图跳转到一个无效的代码地址;这通常发生在如果您尝试对仍然为nil的对象调用虚拟方法。

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

如果你不能在你的调试器中重现它,但它在某个系统上一致地重现,你需要从该系统获得有用的调试信息。有两种方法可以实现这一点:在他们的系统上附加一个调试器(在大多数情况下不太可行)或使用错误记录器来执行

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

德尔福最常见的错误记录工具是EurekaLogMadExcept。我已经同时使用(EurekaLog专业工作和MadExcept进行个人开发),并且我会向任何需要错误记录器的Delphi开发人员推荐其中一个。你需要做的是用这两种工具之一重建你的项目,将它发送给有计算机的客户端,这些客户端会导致一些事情的失误,并告诉他们重现错误并将错误报告发送给你。这应该给你你需要的信息来追踪错误。

+0

谢谢@梅森!由于代码是古老的(15年以上的文档),所以我不确定如何从这里进行调试。你已经给了我一个关于如何进一步排除故障的好方向! – 2013-04-03 21:41:15

+2

作为比较,我们公司使用的软件自Delphi 1发布以来一直存在,包括16个不同的Delphi项目(EXE和DLL以及一个软件包),总计约有1000万行代码。如果我们在追踪访问违规方面没有问题,那对您来说肯定会更容易。而MadExcept是我们的选择记录器。 – 2013-04-03 23:10:36