MessageBox"异常程序终止"使我的应用程序保持运行

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)可靠吗?......或者至少可以建立一些东西?

Jos*_*ley 4

在C++Builder安装文件夹中,检查以下文件:

  • source\cpprtl\Source\misc\errormsg.c - 的实现_ErrorMessage
  • source\cpprtl\Source\procses\abort.c - 的实现abort,它调用_ErrorMessage
  • source\cpprtl\Source\misc\assert.c - 的实现_assert,它调用_ErrorMessage

errormsg.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)