段错误怎么办?快来试试这个,backward-cpp,一款强大的C++堆栈跟踪打印器

本文参考于:

【简书】一个漂亮的C ++堆栈跟踪打印器-backward-cpp https://www.jianshu.com/p/b8e684ae5d88

【知乎】Backward-cpp 妈妈再也不用担心segmentation fault! https://zhuanlan.zhihu.com/p/397148839

在进行C/C++相关开发时候,经常会遇到段错误,这个时候比较无语的一点就是Linux Shell终端下几乎不会输出太多有用的信息,大多数情况下打印信息如下:Segmentation fault (core dumped)

有大佬专门开发了一款工具,叫做backward-cpp用来解决这个问题,其Github仓库地址为:https://github.com/bombela/backward-cpp

配置方法:

如果你的项目使用Cmake构建的,官方提供了两种方式,这里我选择第一种方式

aaa

首先安装用来打印debug信息的第三方库,官方推荐了三个库,这里我们选择libdw from the elfutils

1
sudo apt-get install libdw-dev

把整个仓库放到你的工程目录下,然后在backward-cpp/backward.cpp文件的顶部加入#define BACKWARD_HAS_DW 1,注意要在包含头文件前加入

1
2
3
4
5
#define BACKWARD_HAS_DW 1
#include "backward.hpp"
namespace backward{
backward::SignalHandling sh;
}

简单写一个错误程序测试:

1
2
3
4
5
6
#include<stdio.h>
#include<stdlib.h>
int main(){
char *c = "hello world";
c[1] = 'H';
}

然后在CmakeLists.txt文件中加入

1
2
3
4
add_subdirectory(./backward-cpp)
add_executable(learn_backward learn_backward.cpp ${BACKWARD_ENABLE})
target_link_libraries(learn_backward dw)
add_backward(learn_backward)

注意还要设置CMAKE_BUILD_TYPE为Debug模式

1
SET(CMAKE_BUILD_TYPE Debug)

运行程序,在不加backward-cpp时程序直接报错 段错误 (核心已转储)

在加入backward-cpp后,指出了报错位置。

aaa

备注

在ROS中使用时,如果多个功能包的CmakeLists中都包含add_subdirectory(./backward-cpp),编译时会报错,解决办法为在各个功能包里的Cmakelists中删掉多余的add_subdirectory(./backward-cpp),这行只保留一个。