Linux下使用gdb的调试技巧
1 代码编译阶段
在调试C/C++代码时,在编译阶段使用 gcc/g++ -g
命令编译,将调试信息生成在目标文件中。
2 开启gdb模式
- 直接进入gdb模式:
gdb
- 使用gdb模式开启一个新的进程:
gdb <appname>
- 使用指定的程序来调试core文件:
gdb <appname> <corename>
2.1 gdb模式中常用命令
以下指令为常用指令以及它们的缩写。
-
bt
backtrace 查看调用堆栈
-
i r
info registers 查看寄存器
-
i proc m
memory mappings 查看内存映射
-
b
breakpoint 查看断点信息
-
r
run 运行程序
-
c
continue 继续运行到下一个断点
-
s
step in 跟进所在函数
-
info
info 指令之后可以接很多指令,用于查看当前的运行状态
2.2 调试一个正在运行中的进程
如果一个正在运行中的程序与我们的预想不一样,我们可以使用gdb查看程序的运行状态(debug a running process)
- 方法1:使用
gdb -p <pid>
命令来以attach的方式启动调试该进程id的进程
- 方法2:进入
gdb
模式后,使用attach <pid>
命令调试某个进程
2.3 设置源文件的目录
-
files
命令
-
directory
命令
3 core 文件相关设置
core文件是程序异常崩溃以后产生的,会将程序异常时的执行状态以快照的形式保存下来。可以通过gdb查看core文件内包含的信息,用于分析程序异常的原因。
3.1 查看core文件的设置
-
ulimit -c
用于查看当前系统生成core文件的大小限制,如果设置为0,则表示不生成core文件
-
cat /proc/sys/kernel/core_pattern
用于查看当前系统生成core文件的命名样式
3.2 更改core文件的设置
-
ulimit -c unlimited
不限制生成core文件的大小
-
echo "core.%e.%p.%s" > /proc/sys/kernel/core_pattern
修改core文件命名规则core_pattern
如果不是绝对路径,则core文件会默认生成在可执行文件的同级目录中或用户HOME
目录中
core文件的名称的规则(截取自linux帮助文档 man core
)
%% - a single % character
%p - PID of dumped process
%u - (numeric) real UID of dumped process
%g - (numeric) real GID of dumped process
%s - number of signal causing dump
%t - time of dump, expressed as seconds since the Epoch (00:00h, 1 Jan 1970, UTC)
%h - hostname (same as nodename returned by uname(2))
%e - executable filename (without path prefix)
%c - core file size soft resource limit of crashing process (since Linux 2.6.24)
-
使core相关配置重启后仍然有效
core文件的命名规则配置会在操作系统重启后失效,把下面这句话添加到/etc/sysctl.conf
中,能够使该设置在系统重启后仍然生效。# core dump pattern kernel.core_pattern=core.%p.%e.%s