1. 生成带调试信息的程序
- 直接用g++编译:
$ g++ -g -ggdb -o test test.cpp
如果用CMake编译工程,则使用选项CMAKE_BUILD_TYPE=Debug:
$ cmake -DCMAKE_BUILD_TYPE=Debug ../test
这样做g++编译时就会包含选项-g。如果要同时包含-ggdb选项,可以设置变量CMAKE_CXX_FLAGS_DEBUG。
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
2. 设置Linux生成Core
2.1 设置core文件的大小
$ ulimit -c unlimited
2.2 设置core文件的名称
$ echo core-%e-%p > /proc/sys/kernel/core_pattern
%e - insert coredumping executable name into filename 添加导致产生core的命令名
%p - insert pid into filename 添加pid(进程id)
3. 生成core文件
运行程序,生成core文件。下面的命令强制生成core文件:
$ kill -s SIGSEGV <pid>
4. 调试Core
4.1 加载程序和core文件
$ gdb <exec> <core>
或者进入gdb后
(gdb) file <exec>
(gdb) core <core>
file从文件exec加载symbol和executable, core从core中加载coredump
4.2 加载动态库的符号
如果是调试Core的机器(host)不是生成Core的机器(target),则动态库可能不在程序指定的位置上。这时需要指定动态库的位置。
4.2.1 用info sharedlibrary查看动态库
首先用info sharedlibrary,可以查看动态库的symbol是否加载正确
(gdb) info sharedlibrary
4.2.2 设置solib-absolute-prefix
如果库在host上的布局与在target上的布局相同,则使用solib-absolute-prefix比较方便。
target上:
/opt/publish
host上:
/home/ronzheng/opt/publish
则可以设置solib-search-path为:
(gdb) set solib-absolute-prefix /home/ronzheng
solib-absolute-prefix有个更常用的别名sysroot,所以如下的命令是一样的:
(gdb) set sysroot /home/ronzheng
4.2.3 设置solib-search-path
设置solib-search-path可以指定多个路径,路径之间用:隔开。
(gdb) set solib-search-path <path1:path2:path3>
5. 调试多线程
在多线程的环境下,可以用info threads显示所有线程,thread指定线程为当前线程。
(gdb) info threads
(gdb) thread <tid>
相关链接
GDB 常用法
GDB 调试Coredump问题
嵌入式开发中GDB调试Coredump问题
嵌入式开发中GDB串口远程调试
用backtrace()调试coredump问题
Valgrind memcheck 用法
Address Sanitizer 用法
参考资料
段错误及GDB Coredump调试方法
https://blog.csdn.net/oscarjulia/article/details/74256997
gdb调试多进程与多线程
https://blog.csdn.net/snow_5288/article/details/72982594
网友评论