如何找出导致访问冲突错误的人?

时间:2009-01-27 18:59:00

标签: delphi vb6 windows-vista crash access-violation

我收到有关我的应用在某些Vista计算机上导致GPF的报告。错误消息是这样的:

访问冲突0x75784062(试图写入0x00000006)

为了解决这个问题,我首先要确切知道是谁造成了这个GPF:我的主要exe,一些第三方组件,我自己的一个activex组件,一个dll等......

我怎么能找到这个?哪些工具可以精确定位造成这种混乱的确切模块?

非常感谢任何帮助。

PS我的应用程序是用VB6编写的,我的activex控件是用Delphi 2007编写的。

6 个答案:

答案 0 :(得分:10)

我的建议是尝试使用MadExcept link text或Eurekalog link text。这些捕获未处理的异常并在问题发生时产生堆栈转储。

除了满意的客户之外,没有其他链接。 MadExcept使我能够追踪并消除程序中一些非常罕见的问题。

答案 1 :(得分:3)

我建议使用某种异常挂钩,例如EurekalogmadExcept,在发生异常时会给你一个很好的callstack。

现在这需要你很多帮助,cource ......

我对“查找错误”对话框没有任何好运。通常,一致的失败案例和大量的步进是唯一/最快/最简单的解决方案。如果是未初始化指针或释放对象的情况,FastMM4可以帮助您进行正确的设置。

答案 2 :(得分:1)

当程序崩溃时,Windows应保存crash dump。然后,您可以在WinDbg中加载它,或者在紧凑的Visual Studio中加载它。有多种方法可以分析转储以找出问题所在。为了帮助您入门:

答案 3 :(得分:1)

安装Debug Diag并监控您的应用,他会为您生成DUMP文件并进行分析。

答案 4 :(得分:0)

您可以使用SysInternals网站上的Process Monitor或Process Explorer。

答案 5 :(得分:0)

跟踪AV可能很困难,因为真正的原因可能与实际发生异常的同一点不同。一些一般提示:

  1. 看看地址。 DLL(包括 ActiveX / OCX),加载速度更高 地址,通常超过0x50000000 (systemm DLL通常在 0x70000000到0x78000000)。它看起来你的AV发生在DLL中。请记住,在最新版本的Windows地址空间中,加载随机化可以更改每次运行的地址
  2. 调用堆栈对于理解代码如何进入AV非常有价值。除了EurekaLog和MadExcept之外,JCL / JVCL库还可以获得这些信息。您可能需要使用更多调试信息(和映射文件)进行编译以获得有用的调用堆栈。
  3. Delphi具有Goto地址调试功能,允许加载应用程序,将其暂停在调试器中,然后跳转到某个地址。但它要求地址不会同时改变(重新编译修改可能会改变地址,随机化也会这样做。)
  4. 如果错误在您的开发计算机上无法复制,您可以尝试使用远程调试器来调试在另一台计算机上运行的应用程序。