在进行C/C++相关开发时候,经常会遇到段错误,这个时候比较无语的一点就是终端几乎不会输出太多有用的信息,大多数情况下打印信息如下:
Segmentation fault (core dumped)
有大佬专门开发了一款工具,叫做backward-cpp用来解决这个问题,该工具假设你用Cmake构建项目。
步骤:
首先在你项目CMakeLists.txt文件同目录克隆backward-cpp仓库
cd project
git clone https://github.com/bombela/backward-cpp.git
然后在CMakeLists.txt作以下修改即可:
set(CMAKE_BUILD_TYPE Debug) #需要切换至Debug模式,不要Release模式
add_subdirectory(/path/to/backward-cpp)
# This will add backward.cpp to your target
add_executable(mytarget mysource.cpp ${BACKWARD_ENABLE})
# This will add libraries, definitions and include directories needed by backward
# by setting each property on the target.
add_backward(mytarget)
有个示例如下:
cmake_minimum_required(VERSION 3.0)
INCLUDE_DIRECTORIES("./include")
LINK_DIRECTORIES("/usr/lib")
SET(OPENCV_LIB opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs)
add_executable(demo ./src/main.cpp ./src/common.cpp)
target_link_libraries(demo pthread dl ${OPENCV_LIB})
修改为:
cmake_minimum_required(VERSION 3.0)
set(CMAKE_BUILD_TYPE Debug) #debug模式下可以直接定位到代码coredown的位置
add_subdirectory(./backward-cpp)
INCLUDE_DIRECTORIES("./include")
LINK_DIRECTORIES("/usr/lib")
SET(OPENCV_LIB opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs)
add_executable(demo ./src/main.cpp ./src/common.cpp ${BACKWARD_ENABLE})
add_backward(demo)
target_link_libraries(demo pthread dl ${OPENCV_LIB})
就可以在运行时输出如下信息:
Stack trace (most recent call last):
#8 Object "[0xffffffffffffffff]", at 0xffffffffffffffff, in
#7 Object "./demo", at 0x429a98, in _start
#6 Object "/lib/x86_64-linux-gnu/libc.so.6", at 0x7fd02ede782f, in __libc_start_main
#5 Object "./demo", at 0x4294a9, in main
#4 Object "./demo", at 0x42b3f1, in ager::lib()
#3 Object "/media/lib/x86/libsp.so", at 0x7fd0318d99c6, in pdate
#2 Object "/media/lib/x86/libsp.so", at 0x7fd0318d9d87, in ata
#1 Object "/media/lib/x86/libsp.so", at 0x7fd0318db361, in pdate(SP_INPUT_DATA&, int)
#0 Object "/media/lib/x86/libsp.so", at 0x7fd0318db2ff, in Contex(int)
Segmentation fault (Address not mapped to object [0x38])
Segmentation fault (core dumped)