程序仅在发布版本时崩溃
我在这里遇到了一个“Schroedinger's Cat”类型的问题 - 我的程序(实际上是我的程序的测试套件,但是程序仍在运行)正在崩溃,但是只有在发布模式下构建时,只有在从命令行启动时。 通过洞穴调试(即,讨厌的printf()消息到处),我已经确定了代码崩溃的测试方法,但不幸的是实际崩溃似乎发生在某个析构函数中,因为我看到的最后一条跟踪消息是干净地执行的其他析构函数。
当我尝试在Visual Studio中运行此程序时,它不会崩溃。 从WinDbg.exe启动时也是如此。 崩溃只发生在从命令行启动时发生。 这是在Windows Vista下发生的,顺便说一下,不幸的是我现在无法访问XP机器进行测试。
如果我能让Windows打印出一个堆栈跟踪,或者除了简单地终止该程序,就好像它已经完全退出一样,那将非常好。 有没有人有任何建议,我怎么可以在这里得到一些更有意义的信息,并希望修复这个错误?
编辑:这个问题确实是由一个越界数组引起的,我在这篇文章中更多描述了这个数组。 感谢大家在寻找这个问题上的帮助!
在我见过或听说过的100%的情况下,C或C ++程序在调试器中运行良好,但在外部运行时失败,原因是一直写到函数本地数组的末尾。 (调试器把更多的东西放在堆栈上,所以你不太可能覆盖重要的东西。)
当我在遇到这样的问题之前,通常是由于变量初始化。 在调试模式下,变量和指针会自动初始化为零,但在释放模式下它们不会。 因此,如果你有这样的代码
int* p;
....
if (p == 0) { // do stuff }
在调试模式下,if中的代码不会被执行,但在释放模式下,p包含一个未定义的值,该值不可能为0,所以代码执行时经常会导致崩溃。
我会检查你的代码中未初始化的变量。 这也适用于数组的内容。
需要注意的事项:
数组超支 - visual studio调试器插入可能会停止崩溃的填充。
竞争条件 - 如果竞争条件许多只在直接执行应用程序时才显示,您是否有多个线程参与?
链接 - 是你的发布版本拉入正确的库。
要尝试的事情:
Minidump - 非常易于使用(只需在msdn中查看)会为每个线程提供完整的崩溃转储。 您只需将输出加载到visual studio中,就好像在崩溃时正在调试一样。
链接地址: http://www.djcxy.com/p/82283.html上一篇: Program only crashes as release build
下一篇: PHP Dependency injection and extending from an umbrella class