程序即使在调试器中也突然结束——这是怎么发生的?

8
我正在尝试调试一个意外关闭的程序。当我说“关闭”时,我的意思是,一刻钟前我看到所有窗口都被显示出来,每个窗口都显示了正确的数据,然后突然所有窗口都消失了。没有任何错误信息弹出框。所以我尝试在调试器中运行该程序,希望它能够捕获导致程序中止的原因,但即使在调试器中,该程序也会突然结束。调试器中的最后一行是:
The program '[5500] test.exe: Native' has exited with code 0 (0x0).

我的程序非常庞大而且非常古老,有很多自我诊断。我的怀疑是可能一个自检失败了,也许我只是调用了“exit()”,忘记弹出一个对话框来解释为什么。

现在我的问题是,我如何找出程序退出的代码点?


1
其中一种解决方案是搜索所有代码中调用exit()函数的地方,并在那里设置断点。如果您的代码中存在未包装的exit()调用,那么这意味着设计不良 - 您应该有一个包装函数来显示消息,然后调用exit()。 - sharptooth
2个回答

5

exit()terminate()上设置断点(也许一个调用另一个,但我不确定)。


terminate() 调用 abort(),而不是 exit()。 - sharptooth
@Marcelo Cantos:你说“在exit()上设置断点”好像我只有一个……但是有成百上千个。你是在建议我在exit()内部设置断点吗? - Mick
@Mick:在命令行调试器中,break exit 就可以做到这一点。 - Potatoswatter
2
@Mick:也许现在是重构代码的时候了,这样你就不会有那么多直接调用exit()的情况了? - sharptooth
3
在 Visual Studio 2010 中,选择“调试(Debug)” -> “新建断点(New Breakpoint)” -> “在函数处中断(Break at Function)”; 在“函数(Function)”字段中输入“exit”,并选择正确的编程语言。 - Aaron Campbell
Aaron的上面的回答就是解决方法。但我发现你还需要对“abort”做同样的处理,以捕获更多突然终止的情况。 - Edward

4

Marcelo的回答非常好。如果由于某种原因你不能在exit处断点,可以使用atexit安装一个函数(不带参数,返回void),然后在这个函数内部中断。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接