11

我收到报告说我的应用程序在某些 Vista 机器上导致了 GPF。错误消息是这样的:

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

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

我怎样才能找到这个?什么工具可以查明导致这种混乱的确切模块?

任何帮助将不胜感激。

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

4

6 回答 6

10

我的建议是尝试 MadExcept链接文本或 Eurekalog链接文本。这些捕获未处理的异常并在问题发生时生成堆栈转储。

除了作为满意的客户外,没有与这些相关的链接。MadExcept 使我能够追踪并消除程序中一些非常罕见的问题。

于 2009-01-27T21:54:55.753 回答
3

我会推荐某种异常钩子,比如EurekalogmadExcept,当异常发生时,它会为你提供一个很好的调用堆栈。

当然,现在这对您有很大帮助...

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

于 2009-01-27T21:57:01.820 回答
1

当程序崩溃时,Windows 应该保存崩溃转储。然后,您可以在 WinDbg 或在紧要关头的 Visual Studio 中加载它。有多种方法可以分析转储以找出问题所在。为了让你开始:

于 2009-01-27T19:04:40.310 回答
1

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

于 2009-01-27T19:29:52.240 回答
0

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

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

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

于 2009-01-27T19:15:54.453 回答