使用C++ / GCC / Linux有时无法捕获异常

cfh9epnr  于 2023-08-06  发布在  Linux
关注(0)|答案(2)|浏览(222)

偶尔我会遇到一段代码,其中没有捕获异常。到目前为止,我不知道可能的原因是什么。
下面是一段代码的例子。

  • 打印日志消息“初始化”。
  • 打印来自module->Init()的一些日志消息
  • module->init()抛出异常
  • catch块中的日志消息不打印

应用程序终止

log::trace( "Initializing" );
try
{
   module->Init();
}
catch( const std::exception& e )
{
    log::error( "Error initializing module:{}", e.what());
}
catch( ... )
{
    log::error( "Unknown exception initializing module" );
}

dmesg:
[    9.557049] terminate called after throwing an instance of '
[    9.562655] std::runtime_error
[    9.565715] '
[    9.567350]   what(): 
followed by the error message passed to what() which was the generated  exception message in init.

字符串

  • 异常处理在同一应用程序的其他部分按预期工作。
  • 从主线程引发异常。
  • 嵌入式ARM平台搭建系统。所有库都使用相同的编译器编译。
  • 编译器使用GCC 8.2.0

有没有什么我不知道的,可能会导致异常没有被捕获?

wgmfuz8q

wgmfuz8q1#

实际上忽略了头文件中的一些东西。该函数被标记为“noexcept”,这实际上在抛出异常时导致终止。

2w3rbyxf

2w3rbyxf2#

我发现catch(...)在Windows中捕获C++中的除零错误和坏指针错误。但是在Linux中,我运气不好。程序要崩溃了。我对此无能为力。但如果能知道错误在哪里,或者甚至像C#那样显示堆栈跟踪,那就太好了。
我发现Linux在转储之前会向程序发送一个signal。我可以捕获该信号并显示错误消息。我试着用setjmplongjmp从信号中逃回主程序,但我发现程序会死,没有什么可以保存它。
我写这个项目是为了演示如何用signal命令捕获错误,并显示错误发生的堆栈跟踪。
https://github.com/RussellHankins/ShowErrorsInC-Linux

相关问题