【问题标题】:Windows 7 exception code: 0xc0000409Windows 7 异常代码:0xc0000409
【发布时间】:2014-06-18 01:20:34
【问题描述】:

我有一个由另一位程序员完成的 C++ Windows 应用程序,我必须删除一行代码。使用 Visual Studio 2013 重建应用程序后,它会在事件日志中崩溃:

Faulting application name: WaveStream.exe, version: 0.0.0.0, time stamp: 0x536122da
Faulting module name: WaveStream.exe, version: 0.0.0.0, time stamp: 0x536122da
Exception code: 0xc0000409
Fault offset: 0x0000bd7f
Faulting process id: 0x8b8
Faulting application start time: 0x01cf6490aee4f557
Faulting application path: C:\Program Files (x86)\PS Audio\WaveStream.exe
Faulting module path: C:\Program Files (x86)\PS Audio\WaveStream.exe
Report Id: efe00d42-d083-11e3-a513-bc305baf9e1e

应用程序使用 QT 4.7.4,并且编译没有错误。我是一名嵌入式系统程序员,几乎没有 Windows 编程经验。我该怎么做才能弄清楚它为什么会崩溃?

丹尼斯

【问题讨论】:

  • 您可以使用 Visual Studio 构建调试版本并附加到它,一旦发生此故障,它应该会中断
  • 就像我说的,我对 Visual Studio 环境中的编程不是很熟悉。我不知道该怎么做,你能给我一个 HowTo 链接吗?
  • msdn.microsoft.com/en-us/library/sc65sadd.aspx,你确定你删除的那一行代码就是这个原因吗?如果你把它放回去会发生什么,你能把这段代码贴出来,只要它不太长。
  • 把这行代码放回去,看看为什么它如此重要。
  • 我很肯定我删除的代码行不是问题。我把它放回去了,但问题仍然存在。我确定它在我的构建环境或系统设置中。

标签: c++ windows visual-studio qt visual-c++


【解决方案1】:

问题的线索在异常代码中:0xc0000409

0xc0000409 表示 STATUS_STACK_BUFFER_OVERRUN

换句话说,您的程序中的某些内容正在写入超出当前堆栈帧的内容,从而破坏了堆栈上的数据。程序检测到这一点,并没有让它继续,而是抛出了一个异常。

你如何调试这个?有几个选项:

1) 在调试器中重新运行它并观察它崩溃,检查失败的地方。

2)如果您有此故障转储,请将其加载到调试器中,按 F5 并测试失败的地方。

3) 如果您没有崩溃转储,如果您知道崩溃的绝对地址(并且知道模块总是在一个固定地址),或者如果您知道崩溃位置从故障模块开始的偏移量。

上面的崩溃信息告诉您崩溃的故障模块的偏移量。这在故障偏移字段中报告。在您的示例中,这是 0x0000bd7f 的偏移量。

如果您有原始的 dll/exe 并且它与 PDB 匹配,只需将其加载到 DbgHelpBrowser,进入 查询 菜单,选择 “查找具有 DLL 相对地址的符号...” 然后在字段中输入偏移量并单击“查找符号...”。显示屏将移动以向您显示最近的匹配符号,突出显示该符号并显示有关参数、行号和源代码的任何信息。

这是一个免费的工具。你可以在这里得到它: https://www.softwareverify.com/cpp-dbghelp-browser.php

免责声明。我写这个工具就是为了我们的内部使用来完成这项工作。我们最近将其提供给其他所有人。我在尝试理解异常代码 0xc0000409 的含义时发现了这个问题。

【讨论】:

  • 不幸的是(根据我的经验,无论如何),给出的偏移量是引发错误的代码的地址——尝试调用 Watson 进行报告的实现。这不是故障的实际位置。由于这里的问题是内存损坏,因此导致损坏的代码已经消失,并且是注意到金丝雀被杀死的代码引发了问题。这可能会让您找到正确的功能,但它不是日志中报告的偏移量。
  • @MikeB: C0000409 是fail-fast exception。一般来说,由于内存损坏导致的 SEH 异常可以在很久以后报告,但这是规则的一个例外(双关语)
  • 请注意,STATUS_STACK_BUFFER_OVERRUN 通常并不意味着堆栈缓冲区溢出,它只是意味着应用程序决定匆忙终止自己。更多详情here.
【解决方案2】:

尝试为应用程序创建故障转储。请参阅this StackOverflow questionMSDN documentation 了解如何执行此操作。获得故障转储文件后,在 Visual Studio 调试器中打开它,您将能够看到异常和异常的调用堆栈,这应该会有所帮助。

【讨论】:

    【解决方案3】:

    !analyize -v in windbg

    它会为你做很多工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      • 1970-01-01
      相关资源
      最近更新 更多