Windows 7异常代码:0xc0000409

Den*_*isk 4 c++ windows qt visual-studio visual-c++

我有一个由另一位程序员完成的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
Run Code Online (Sandbox Code Playgroud)

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

丹尼斯

Ste*_*ett 8

问题的线索在异常代码中: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的含义时发现了这个问题。

  • 请注意,STATUS_STACK_BUFFER_OVERRUN 通常并不意味着堆栈缓冲区溢出,它只是意味着应用程序决定匆忙终止自身。更多详细信息[此处](https://devblogs.microsoft.com/oldnewthing/20190108-00/?p=100655)。 (7认同)
  • 不幸的是(无论如何,根据我的经验)给出的偏移量是引发错误的代码的地址——尝试调用 Watson 来执行报告的实现。这不是故障的实际位置。由于这里的问题是内存损坏,导致损坏的代码已经消失,而引起问题的是注意到金丝雀被杀死的代码。这可能会让您找到正确的函数,但它不是日志中报告的偏移量。 (2认同)
  • @MikeB:C0000409 是一个[快速失败异常](https://channel9.msdn.com/Shows/Inside/C0000409)。一般来说,由于内存损坏而导致的 SEH 异常可以在很晚之后报告,但这是规则的一个例外(双关语) (2认同)

RC *_*and 4

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