如何在Windows上诊断异常代码0xc0000409

How do you diagnose the exception code 0xc0000409 on Windows?

本文关键字:异常 代码 0xc0000409 诊断 Windows      更新时间:2023-10-16

我有一个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 AudioWaveStream.exe
Faulting module path: C:Program Files (x86)PS AudioWaveStream.exe
Report Id: efe00d42-d083-11e3-a513-bc305baf9e1e

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

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

尝试为应用程序创建崩溃转储。请参阅此StackOverflow问题和MSDN文档,了解如何做到这一点。一旦您有了崩溃转储文件,请在Visual Studio调试器中打开它,您将能够看到异常和异常的调用堆栈,这应该会有所帮助。

!分析windbg 中的-v

它会为你做很多工作。