请帮忙!我真的很有智慧.我的程序是一个小的个人笔记管理器(google为"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)写一个日志表明崩溃发生在一个本地int变量的声明上!怎么会这样?内存腐败?
可执行文件/程序集中的底层代码是什么?声明int根本就没有代码,因此不会崩溃.你以某种方式初始化int吗?
要查看发生崩溃的代码,您应该执行所谓的事后分析.
如果要分析崩溃,则应该进行崩溃转储.一个选项是注册Windows错误报告 - 需要一些钱(您需要一个数字代码签名ID)和一些表单填写.有关更多信息,请访问https://winqual.microsoft.com/.
另一种选择是与一些正在经历崩溃的用户取得联系并直接从他那里获得用于WER的崩溃转储.用户可以在将崩溃发送给Microsoft之前单击技术详细信息时执行此操作 - 可以在那里检查故障转储文件位置.
另一种选择是注册自己的异常处理程序,处理异常并在任何地方编写minidump.详细说明可以在Code Project Post-Mortem调试您的应用程序与Minidumps和Visual Studio .NET文章中找到.
所以当配置是DEBUG配置时它不会崩溃?有许多不同于RELEASE配置的东西:1.)全局化的初始化2.)实际的机器代码生成等.
因此,与DEBUG模式相比,第一步是找出RELEASE模式中每个参数的确切设置.
-广告