c++ - 海森堡 : WinApi program crashes on some computers

标签 c++ debugging winapi crash gdi

求助!我真是无计可施了。 我的程序是一个小的个人笔记管理器(谷歌搜索“cintanotes”)。 在某些计算机上(当然我不拥有它们)它在启动后立即崩溃并出现未处理的异常。 这些计算机没有什么特别之处,只是它们往往配备 AMD CPU。

环境:Windows XP、Visual C++ 2005/2008、原始 WinApi。

关于这个“Heisenbug”,可以肯定的是:

1) 崩溃仅发生在 Release 版本中。

2) 一旦我删除了所有与 GDI 相关的内容,崩溃就会消失。

3) BoundChecker 没有任何提示。

4) 写日志显示崩溃发生在局部 int 变量的声明上!怎么可能呢?内存损坏?

任何想法将不胜感激!

更新:我已经成功地在“有故障”的 PC 上调试了该应用程序。结果:

“CintaNotes.exe 中 0x0044a26a 处未处理的异常:0xC000001D:非法指令。”

代码中断

0044A26A cvtsi2sd xmm1,dword ptr [esp+14h]

看来问题出在“代码生成/启用增强指令集”编译器选项中。它被设置为“/arch:SSE2”并且在不支持 SSE2 的机器上崩溃。我已将此选项设置为“未设置”,错误消失了。呸!

非常感谢大家的帮助!!

最佳答案

4) Writig a log shows that the crash happen on a declaration of a local int variable! how could that be? Memory corruption?

可执行文件/程序集中的底层代码是什么? int 声明根本不是代码,因此不会崩溃。你会以某种方式初始化 int 吗?

要查看发生崩溃的代码,您应该执行所谓的事后分析。

Windows 错误报告

如果你想分析崩溃,你应该得到一个崩溃转储。一种选择是注册 Windows 错误报告——需要一些钱(你需要一个数字代码签名 ID)和一些表格填写。更多请访问https://winqual.microsoft.com/ .

直接从客户那里获取用于 WER 的故障转储

另一种选择是与遇到崩溃的某个用户取得联系,并直接从他那里获得用于 WER 的崩溃转储。用户可以在将崩溃发送给 Microsoft 之前单击技术详细信息来执行此操作 - 可以在此处检查崩溃转储文件的位置。

你自己的小型转储

另一种选择是注册您自己的异常处理程序,处理异常并在您希望的任何地方编写一个小型转储。详细说明可见Code Project Post-Mortem Debugging Your Application with Minidumps and Visual Studio .NET article .

关于c++ - 海森堡 : WinApi program crashes on some computers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/132116/

相关文章:

c++ - 工厂方法模式使用继承,而抽象工厂模式使用组合如何?

debugging - 禁用 JVM 热插拔

php - 调试PHP

c# - 我可以在 C# 进程中使用 SetErrorMode 吗?

c++ - winapi GetProcessMemoryInfo invalid arguments 问题

c++ - 在另一个项目中包含继承类时出现抽象类的链接器错误

c++ - 构造一个对象,将其传递给基类构造函数以控制其生命周期

c++ - C++ 中的抛出和三元运算符

android - 在哪里可以找到 Android Studio 路径?

c++ - mfc sdi 应用程序 cdocument dosave 错误 0xFEEEFEEE