gpt4 book ai didi

c++ - MessageBox "Abnormal program termination"让我的应用程序保持运行

转载 作者:可可西里 更新时间:2023-11-01 13:23:44 25 4
gpt4 key购买 nike

...有点。正如这个极其简单的示例所示,

enter image description here

非常罕见(到目前为止只有一次报告),我的一个应用程序碰巧以这种方式崩溃。当发生非特定异常时,我想像往常一样终止它。我的策略是(低级别)记录问题,然后终止。该应用程序是子系统的一部分,如果检测到任何问题,我想(重新)启动它。它是用 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“搜索问题的解决方案”。)

从您的角度来看,这(为中止注册一个信号处理程序并在那里调用退出)可靠吗? ...或者至少是可以建立的东西?

最佳答案

在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 函数指针,您可以设置它来覆盖默认行为。虽然它没有记录并且没有在任何头文件中声明,但您可以将其声明为 extern 并以这种方式访问​​它。示例用法:

extern int (_RTLENTRY * _EXPDATA _messagefunc)(char *msg);

static int LogAndDie(char *msg)
{
LogMessageToSomeFile(msg);
exit(1);
return 0;
}

void InitializeErrorHandling()
{
_messagefunc = LogAndDie;
}

关于c++ - MessageBox "Abnormal program termination"让我的应用程序保持运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25305653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com