【发布时间】:2014-10-07 23:07:18
【问题描述】:
...有点。正如这个极其简单的例子所示,
非常罕见(到目前为止仅报告过一次),我的一个应用程序碰巧以这种方式崩溃。当发生非特定异常时,我想像往常一样终止它。我的策略是(低级)记录问题,然后终止。该应用程序是子系统的一部分,如果检测到任何问题,我想(重新)启动它。它使用 C++-Builder 6 构建并在 Windows (XP...7, 也是 8) 上运行。我了解到abort() 很可能导致了错误消息。该应用程序有一个 GUI,这就是为什么会显示一个消息框而不是仅仅向stderr 进行(解除阻塞)输出。
只要消息框不被用户接受,我的应用程序明显保持运行,例如它处理计时器(上面示例中的生命周期增加)或进程间消息,完全不知道这个问题。
在阅读了What is the easiest way to make a C++ program crash?和Difference between raise(SIGABRT) and abort() methods的一些答案后,我尝试了以下
void mySignalHandler(int sig)
{
// low-level error reporting here
exit(-1);
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
signal(SIGABRT, mySignalHandler);
// some more initialisation here
}
如果abort() 或raise(SIGABRT) 被调用,它也可以让我的应用程序终止。 (我也希望阻止Windows“寻找问题的解决方案”。)
从您的角度来看,这(为 abort 注册一个信号处理程序并在那里调用 exit)可靠吗? ...或者至少可以建立一些东西?
【问题讨论】:
-
为什么不简单地尝试调试程序以找出崩溃的原因?如果你修复了崩溃,它们就不会再发生了。
-
使用 POSIX 信号 api 来捕获 Windows 问题并不能很好地工作。使用 SEH。
-
@JoachimPileborg 这并不简单,但我这样做了。同时系统无论如何都要运行......
-
@bmargulies 一个用户报告了这个消息框(直到今天才一次),我的应用程序没有使用 POSIX 信号,它一定是由某些库引起的。
-
“只要消息框不被用户接受,我的应用程序显然会继续运行,”- wat
标签: c++ c windows abort c++builder-6