GDB是Linux下非常好用且强大的调试工具。GDB可以调试C、C++、Go、java、 objective-c、PHP等语言。对于一名Linux下工作的c/c++程序员,GDB是必不可少的工具,本篇以C语言来调试。
前提条件
判断文件是否带有调试信息
要调试C/C++的程序,首先在编译时,要使用gdb调试程序,在使用gcc编译源代码时必须加上“-g”参数。保留调试信息,否则不能使用GDB进行调试。
if(CMAKE_BUILD_TYPE MATCHES Debug)
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g -Wall -Wextra") #set debug cmake choice
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11 -g -Wall -Wextra") #
message(STATUS "Debug mode:${CMAKE_C_FLAGS_DEBUG}")
elseif(CMAKE_BUILD_TYPE MATCHES Release)
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wall -O2 -Wextra") #set reeeleae cmake choice optimize level O2
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -std=c++11 -Wall -O2 -Wextra") #
message(STATUS "Release mode:${CMAKE_C_FLAGS_RELEASE}")
else()
endif()
- 检查方式1:
有一种情况,有一个编译好的二进制文件,你不确定是不是带有-g参数,带有GDB调试,这个时候你可以使用如下的命令验证:
- 检查方式2:
有一种情况,有一个编译好的二进制文件,你不确定是不是带有-g参数,带有GDB调试,这个时候你可以使用如下的命令验证:
readelf -S hello|grep debug
gdb启动程序后就可以按照其命令进行调试,与MCU的单步运行、查看变量值等原理相同,只不过gdb需要通过输入调试命令进行调试,调试命令参考,常用如下
coredump文件生成配置
Core Dump:Core的意思是内存,Dump的意思是扔出来,堆出来(段错误)。开发和使用Unix程序时,有时程序莫名其妙的down了,却没有任何的提示(有时候会提示core dumped),这时候可以查看一下有没有形如core.进程号的文件生成,这个文件便是操作系统把程序down掉时的内存内容扔出来生成的, 它可以做为调试程序的参考,能够很大程序帮助我们定位问题。
- coredump文件大小设置
查看方式:
sudo ulimit -c
设置方式
sudo ulimit -c unlimited
- 更改core dump生成路径
因为core dump默认会生成在程序的工作目录,但是有些程序存在切换目录的情况,导致core dump生成的路径没有规律
所以最好是自己建立一个文件夹,存放生成的core文件
sudo mkdir -p /data/coredump
3、设置core dump生成文件格式
为方便分辨coredump文件的来源及时间,需要多coredump的文件格式进行设置
sudo sh -c "echo '/data/coredump/core_$(date +%Y-%m-%d_%H-%M-%S)-%p.dump' > /proc/sys/kernel/core_pattern"
总设置脚本如下
#!/bin/bash
COREDUMP_DIR="/data/coredump"
# check dir existed
if [ ! -d "$COREDUMP_DIR" ]; then
mkdir -p "$COREDUMP_DIR"
echo "Folder $COREDUMP_DIR created."
else
echo "Folder $COREDUMP_DIR already exists."
fi
ulimit -c unlimited
ulimit -c
sh -c "echo '/data/coredump/core_$(date +%Y-%m-%d_%H-%M-%S)-%p.dump' > /proc/sys/kernel/core_pattern"
coredump文件调试确定原因
- 方式1:gdb执行程序+coredump文件
sudo gdb hello /data/coredump/core_2023-11-07_05-46-45-9021.dump
输入bt查看函数的调用的栈帧和层级关系,发现main.c 61行出现问题,取地址错误
- 方式2:gdb执行程序后再执行coredump文件
sudo gdb hello
core-file /data/coredump/core_2023-11-07_05-46-45-9021.dump