即使在调试器中程序也会突然结束——这是怎么发生的?
Posted
技术标签:
【中文标题】即使在调试器中程序也会突然结束——这是怎么发生的?【英文标题】:Program ends abruptly even in debugger - how did that happen? 【发布时间】:2010-04-12 11:12:44 【问题描述】:我正在尝试调试一个意外关闭的程序。当我说“关闭时,我的意思是有一刻我看到所有窗口都在显示,每个窗口都显示所有正确的数据,然后突然所有窗口都消失了。没有消息框报告任何错误。所以我尝试运行调试器中的程序希望它能够以某种方式捕获导致程序中止的任何内容,但即使在调试器中,程序也只是突然结束。调试器中的最后一行是:
The program '[5500] test.exe: Native' has exited with code 0 (0x0).
我的程序非常大而且非常旧,它有很多自我诊断功能。我怀疑可能是自检失败了,也许我只是调用了“exit()”,忘记弹出一个解释原因的对话框。
我现在的问题是,我怎样才能知道我的程序从代码中的哪一点退出?
【问题讨论】:
其中一种解决方案是搜索所有代码以查找对 exit() 等函数的调用,并在此处设置断点。真的,如果你有对 exit() 的调用被解包,那是设计不好的标志——你应该有一个显示消息然后调用 exit() 的包装函数。 【参考方案1】:在exit()
和terminate()
上设置断点(可能一个调用另一个,但我不确定)。
【讨论】:
temrniate() 调用 abort(),而不是 exit()。 @Marcelo Cantos:你说“在 exit() 上设置断点”就好像我只有其中一个......但有数百个。你是在建议我以某种方式在 within exit() 中放置一个断点吗? @Mick:在命令行调试器中,break exit
会这样做。
@Mick:也许是时候重构代码了,这样你就不会直接调用 exit() 了?
在 Visual Studio 2010 中,Debug -> New Breakpoint -> Break at Function;在函数字段中输入exit
并选择正确的语言。【参考方案2】:
马塞洛的回答很棒。如果由于某种原因您无法在 exit
上中断,请使用 atexit
安装一个函数(不带参数,返回 void)并在其中中断。
【讨论】:
以上是关于即使在调试器中程序也会突然结束——这是怎么发生的?的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin PCL Android 应用程序在发布模式下突然崩溃