Wol*_*olf 6 c c++ windows abort c++builder-6
...的种类.正如这个极其简单的例子所示,

很少(到目前为止只报告过一次),碰巧我的一个应用程序崩溃了.我想像通常那样在发生非特定异常时终止它.我的策略是(低级别)记录问题,然后终止.该应用程序是子系统的一部分,如果检测到任何问题,我想(重新)启动它.它是用C++ - Builder 6构建的,可以在Windows上运行(XP ... 7,也是8).我了解到abort()最有可能导致错误消息.该应用程序有一个GUI,这就是为什么显示一个消息框而不是只是一个(解除阻塞)输出stderr.
并且只要用户不接受消息框,我的应用程序就会明显运行,例如它处理定时器(上面示例中的生命周期增加)或进程间消息,完全没有意识到问题.
阅读了一些答案后,什么是使C++程序崩溃的最简单方法?和raise(SIGABRT)和abort()方法之间的区别,我尝试了以下内容
void mySignalHandler(int sig)
{
// low-level error reporting here
exit(-1);
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
signal(SIGABRT, mySignalHandler);
// some more initialisation here
}
Run Code Online (Sandbox Code Playgroud)
如果或被调用,我的应用程序也可以正常终止.(我也希望阻止Windows"寻找问题的解决方案".)abort()raise(SIGABRT)
从您的角度来看,这是(为abort注册信号处理程序并在那里调用exit)可靠吗?......或者至少可以建立一些东西?
在C++Builder安装文件夹中,检查以下文件:
_ErrorMessageabort,它调用_ErrorMessage_assert,它调用_ErrorMessageerrormsg.c 定义了一个未记录的_messagefunc函数指针,您可以设置它来覆盖默认行为。尽管它没有记录并且未在任何头文件中声明,但您可以将其声明为 anextern并以这种方式访问它。使用示例:
extern int (_RTLENTRY * _EXPDATA _messagefunc)(char *msg);
static int LogAndDie(char *msg)
{
LogMessageToSomeFile(msg);
exit(1);
return 0;
}
void InitializeErrorHandling()
{
_messagefunc = LogAndDie;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2107 次 |
| 最近记录: |