【问题标题】:How to diagnose "The instruction at 0x......... referenced memory at 0x00000000"如何诊断“0x处的指令............在0x00000000处引用的内存”
【发布时间】:2016-08-03 12:25:25
【问题描述】:

我负责已知会引发此错误的应用程序。

The instruction at 0x09537333 referenced memory at 0x00000000. The memory could not be read.

很遗憾,我自己无法复制它。

我的问题是,我该如何诊断/调试这个?我有违规指令的内存位置,但我可以追溯到我的代码中的一行吗?即0x09537333 是指相对于我的应用程序的位置还是在操作系统中(Windows 7 Embedded)?

还有其他方法可以获取有关此错误的更多信息吗?我应该在我的代码中寻找任何已知的常见原因吗?

【问题讨论】:

  • 您将无法从中找到错误的原因 - 您需要在您的 exe 中包含 pdb 文件,以便在发生崩溃时您将获得堆栈跟踪。跨度>
  • 您的应用是否生成了 minidump 文件?如果是这样,您可以将其加载到 WinDbg 中并计算出来,不过这是一个相当复杂的操作。
  • 0x00000000 is null0x09537333处的代码访问null对象什么的;通常起始地址是0x00400000检查这个,Windows可以很好地使用另一个)所以RVA(相对虚拟地址)是0x09137333(假设起始地址是0040:0000)然后使用pdb 或其他调试信息将 RVA 映射到源代码行
  • 我说对您的代码运行一个静态分析器,并注意所有显示“可以取消引用”的地方。你在某个地方有一个错误。
  • @DmitryBychenko - 那么这与“对象引用未设置为实例...”有什么不同?

标签: c# .net memory runtime-error


【解决方案1】:

我已经解决了这个问题 - 这里有一些信息,以防其他人有同样的问题。

做了更多的研究,发现这个访问冲突错误可能是由调用非托管函数/代码(例如用 C++ 编写的 dll)中的错误引起的 - try... catch 通常不会捕获此错误,但如果将其添加到 app.config 文件中就会捕获:

<runtime>
   <legacyCorruptedStateExceptionsPolicy enabled="true" />
</runtime>

这是一种可能性。

但事实上,在我的情况下,错误是由一个线程在一个表单上运行异常长时间引起的。

表单在完成之前已关闭。在线程结束时,它试图隐藏表单上的按钮。由于此时已处理表单,因此引发了访问冲突错误。

我通过解决导致线程运行这么长时间的问题来修复它,但也“以防万一”,补充说

if (this.IsDisposed)
{
    return;
}

...前面对按钮的处理。

【讨论】:

    【解决方案2】:

    当 0x00000000 是无法读取的地址时,你所拥有的就是一个空指针解引用。

    【讨论】:

      【解决方案3】:

      您可以通过以下方式解决此问题:

      1. 卸载有问题的软件

      2. 更新驱动程序

      3. 按照说明进行操作:
        右键单击我的电脑图标,然后前往高级 选项卡,然后单击“性能”下的“设置”。

        然后再次转到“高级”选项卡并单击“更改”按钮 虚拟内存。完成这些更改后,您可以重新启动计算机 看看问题是否消失。

      【讨论】:

        猜你喜欢
        • 2011-06-05
        • 1970-01-01
        • 1970-01-01
        • 2017-08-15
        • 1970-01-01
        • 2013-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多