我偶尔会遇到一段没有捕获异常的代码。到目前为止,我还不知道可能的原因是什么。
下面这段代码为例:
- 日志信息"初始化"。是打印出来。
- 打印->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