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


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

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

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

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

任何帮助将不胜感激。

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


12889
2018-01-27 18:59


起源

你可以找到答案 这里,应该有一个“查找错误”功能,可以帮助您找到问题 - Filip Ekberg


答案:


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

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


10
2018-01-27 21:54



呸!在球门线上被击败;-) - Vegar
很好的建议,虽然我想知道它是否适用于这种情况。应用程序是VB6,只有应用程序中使用的ActiveX控件是用Delphi编写的。 - Lars Truijens
从错误消息的粗略轮廓,它听起来不像是导致错误的VB6部分。我办公室里做VB6工作的人说创建这个错误非常棘手(但并非不可能)。无论如何,我认为尽可能多地尝试陷阱/处理总是更好。 - Peter McMinn


我会推荐某种Exception-hook,比如 Eurekalog 要么 madExcept 当发生异常时,它会给你一个很好的callstack。

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

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


3
2018-01-27 21:57



eurekalog本身就是越野车:)去疯狂吧 - Everybody_hates_BillTheLizard


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


1
2018-01-27 19:04



如果我得到一个AV但程序没有崩溃(所以没有dmp文件)怎么办? - Everybody_hates_BillTheLizard


安装 调试诊断 并监控您的应用程序,他为您生成DUMP文件并进行分析。


1
2018-01-27 19:29





您可以使用Process Monitor或Process Explorer Sysinternals的 现场。


0
2018-01-27 19:15



并使用它们如何? - Everybody_hates_BillTheLizard


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

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

0
2018-05-21 10:01



ASLR(地址空间加载随机化)是否适用?根据我的阅读,需要为您的应用程序明确启用它。 - Disillusioned