段错误怎么办?快来试试这个,backward-cpp,一款强大的C++堆栈跟踪打印器
段错误怎么办?快来试试这个,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构建的,官方提供了两种方式,这里我选择第一种方式
首先安装用来打印debug信息的第三方库,官方推荐了三个库,这里我们选择libdw from the elfutils
1 | sudo apt-get install libdw-dev |
把整个仓库放到你的工程目录下,然后在backward-cpp/backward.cpp文件的顶部加入#define BACKWARD_HAS_DW 1,注意要在包含头文件前加入
1 |
|
简单写一个错误程序测试:
1 |
|
然后在CmakeLists.txt文件中加入
1 | add_subdirectory(./backward-cpp) |
注意还要设置CMAKE_BUILD_TYPE为Debug模式
1 | SET(CMAKE_BUILD_TYPE Debug) |
运行程序,在不加backward-cpp时程序直接报错 段错误 (核心已转储)
在加入backward-cpp后,指出了报错位置。
备注
在ROS中使用时,如果多个功能包的CmakeLists中都包含add_subdirectory(./backward-cpp),编译时会报错,解决办法为在各个功能包里的Cmakelists中删掉多余的add_subdirectory(./backward-cpp),这行只保留一个。