【问题标题】:The instruction at "<address>" referenced memory at "<address>". The memory could not be "read."“<address>”处的指令引用了“<address>”处的内存。无法“读取”内存。
【发布时间】:2009-04-21 11:32:11
【问题描述】:

一个 c/c++ 应用程序抛出该错误,如何开始调试(比添加打印语句更好的主意)?

【问题讨论】:

  • 没有一种叫做“c/c++”的语言……为什么不直接说明它是什么?如果你的标签暗示它是 C 和 C++,你可以这么说。
  • 你最熟悉的调试器是什么?是时候启动它了。
  • 也许他/她不知道上面写的是什么。
  • 为了迂腐,C 不会“抛出”错误。
  • 用户提问,如何开始回答(比随机回答更好)?

标签: c++ c winapi


【解决方案1】:

第二个地址是不是很小的数字,比如 0x00000001 或 0x00000000?如果是这样,你可能只是忘了初始化一个指针。

在任何情况下,标准的调试技巧都适用:通过注意问题何时发生并从那里缩小范围来开始隔离问题。

【讨论】:

  • 小号:初始化了一个指向NULL的指针,从未分配过合适的值。地址空间之外的随机数(特别是如果指针的大部分或所有字节都在 0x20-0x7f 范围内!):忘记初始化指针,包含来自其他对象的字节。
【解决方案2】:

错误消息表明您正在使用 Visual Studio 进行开发。好吧,至少这是我在该措辞中看到此错误消息的唯一开发环境。

如果是这种情况,您可以使用内置的异常调试来捕获访问冲突并通过这种方式获取调用堆栈。

要在我目前打开的 VC++ 2003 中执行此操作,请转到 Debug->Exceptions,打开“Win32 Exceptions”,单击“c0000005 Access Violation”并将“抛出异常时”设置为“Break into调试器”。

【讨论】:

  • 我从已经崩溃的知名品牌软件中得到了这个错误,我假设该消息来自 Windows。总觉得它报告内存不能“读”或“写”是可悲的。
  • 为什么它也出现在语音标记中?这就像它试图解释或其他什么。
【解决方案3】:

正如其他人所说,如果这可以在您的开发机器上重现,请启动调试器并设置断点/单步执行代码。

但是,如果这发生在客户的机器上并且调试器不可用,您可以通过使用 SetUnhandledExceptionFilter 并将信息写入日志文件来获取一些相同的信息(调用堆栈、寄存器等),或者做一个小型转储。我怀疑调用堆栈将是最有用的起点,因此您可以在处理程序中使用 StackWalk 函数之一并写入日志文件。对于该应用程序的构建,这至少需要一个映射文件或一组符号 (PDB)。

【讨论】:

    【解决方案4】:

    没有代码就很难提出任何建议。尝试在遇到问题之前使用调试器并在代码中设置断点。

    【讨论】:

      【解决方案5】:

      根据您的开发环境,您的程序的映射文件可能会有所帮助

      【讨论】:

        【解决方案6】:

        您可以使用 GDB 调试您的应用程序:http://www.gnu.org/software/gdb/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-29
          • 2011-06-05
          • 1970-01-01
          • 2011-04-20
          • 1970-01-01
          • 1970-01-01
          • 2016-04-01
          • 1970-01-01
          相关资源
          最近更新 更多