在c++ / GCC / Linux中有时无法捕获异常



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

下面这段代码为例:

  • 日志信息"初始化"。是打印出来。
  • 打印->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

是否有我不知道的东西,可能导致异常未被捕获?

实际上忽略了头文件中的某些内容。该函数被标记为"不例外"。当抛出异常时,实际上会导致终止。

我发现catch(…)捕获了Windows中c++中的除零错误和坏指针错误。但是在Linux中,我就没那么幸运了。程序要崩溃了。我对此无能为力。但是如果能知道错误在哪里就好了,或者甚至可以像c#那样显示堆栈跟踪。

我发现Linux发送一个信号给程序,就在Linux转储它之前。我可以捕获该信号并显示错误消息。我试着用setjmp和longjmp从信号逃回主程序,但是我发现程序会死,没有什么可以保存它。

我编写这个项目是为了演示如何使用signal命令捕获错误,并显示错误发生的堆栈跟踪。

https://github.com/RussellHankins/ShowErrorsInC-Linux

相关内容

  • 没有找到相关文章

最新更新