我有一个由另一位程序员完成的 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 编程经验。我该怎么做才能弄清楚崩溃的原因?
丹尼斯
最佳答案
问题的线索在异常代码:0xc0000409
0xc0000409 表示STATUS_STACK_BUFFER_OVERRUN。
换句话说,您程序中的某些内容正在写入当前堆栈帧,从而破坏了堆栈中的数据。该程序已检测到这一点,并没有让它继续,而是抛出了一个异常。
你如何调试这个?有几个选项:
1) 在调试器中重新运行它并观察它崩溃,找出失败的地方。
2) 如果您有此故障转储,请将其加载到调试器中,按 F5 键并尝试失败的部分。
3) 如果您没有崩溃转储,如果您知道崩溃的绝对地址(并且知道模块始终加载于一个固定地址),或者如果你知道崩溃位置从故障模块开始的偏移量。
上面的崩溃信息告诉你崩溃的故障模块的偏移量。这在 Fault Offset 字段中报告。在您的示例中,这是 0x0000bd7f 的偏移量。
如果您有原始的 dll/exe 并且它与 PDB 匹配,只需将其加载到 DbgHelpBrowser 中即可,转到查询菜单,选择“使用DLL相对地址查找符号...”然后在字段中输入偏移量并单击“查找符号.. ”。显示屏将移动以向您显示最近的匹配符号,突出显示该符号并显示有关参数、行号和源代码的任何信息。
这是一个免费工具。你可以在这里得到它: https://www.softwareverify.com/cpp-dbghelp-browser.php
免责声明。我编写这个工具来完成这项工作,供我们内部使用。我们最近将其提供给其他所有人。我在试图理解异常代码 0xc0000409 的含义时发现了这个问题。
关于c++ - Windows 7 异常代码 : 0xc0000409,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23409809/