在SIGABRT c ++信号之后继续运行程序

mor*_*adi 1 c++ qt

我在我的c ++程序中使用第三个库,在某些情况下会发出SIGABRT信号.我知道尝试释放非初始化指针或类似的东西可能是这个信号的原因.不过,我希望在发出此信号后继续运行我的程序,以显示消息并允许用户更改设置,以便处理此信号.
(我使用QT进行开发.)

我怎样才能做到这一点?

Bas*_*tch 5

我在我的c ++程序中使用第三个库,在某些情况下会发出SIGABRT信号

如果您有该库的源代码,则需要更正错误(错误可能在您的代码中).

BTW,可能是SIGABRT因为abort(3)间接调用(可能是因为你违反了该库的某些约定或不变量,可能使用assert(3) - 并且间接调用abort).我想在caffe中各种CHECK*宏可以间接调用abort.我让你去调查一下.

如果您没有源代码或没有足够的时间来修复该第三方库中的该错误,您应该放弃使用该库并使用其他内容.

在许多情况下,您应该信任外部库而不是您自己的代码.可能是你滥用或滥用该库.仔细阅读其文档,并确保您自己的代码正确使用该库并尊重其不变量和约定.可能这个错误在你自己的代码中,在其他地方.

我想继续运行我的程序

这是不可能的(或非常不可靠,如此不合理).我想你的程序有一些未定义的行为.是 害怕,并努力避免UB.

您需要提高调试技巧.更好地了解如何使用gdb调试器,Valgrind的,GCC消毒剂(如仪表选项一样-fsanitize=address,-fsanitize=undefined等),等等.

SIGABRT原则上可以合理地不应该尝试处理(但仔细阅读信号(7),信号安全(7)和关于在Qt中处理Unix信号的提示).我强烈建议避免尝试捕捉SIGABRT.

  • @simurg,你有一个关于信任图书馆的观点.OTOH,信任是最重要的,而且大多数库比你今天编写的任何代码都有更多的测试!我们不能假设图书馆是绝对可靠的,但它不太可能出错,而且我总是在我自己的代码中开始寻找漏洞.我完全同意闭源库没有帮助,绝不会建议使用任何. (2认同)