gdb 调试
coredump
检查生成core文件的选项是否打开
#查看 coredump 文件的大小,一般开始是 0,表示 coredump 开关处于关闭状态
ulimit –c
修改 core 文件大小,单位 KB
vi ~/.bashrc
ulimit -c 1024 #最大1024KB
ulimit -c unlimited #取消大小限制
显示所有的 ulimit 信息
/tmp # ulimit -a
-f: file size (blocks) unlimited
-t: cpu time (seconds) unlimited
-d: data seg size (kb) unlimited
-s: stack size (kb) 8192
-c: core file size (blocks) unlimited
-m: resident set size (kb) unlimited
-l: locked memory (kb) 64
-p: processes 1364
-n: file descriptors 1024
-v: address space (kb) unlimited
-w: locks unlimited
-e: scheduling priority 0
-r: real-time priority 0
core 文件的名称和生成路径
控制产生的 core 文件的文件名中是否添加 pid
echo "1" > /proc/sys/kernel/core_uses_pid #添加
echo "0" > /proc/sys/kernel/core_uses_pid #不添加
core 文件保存位置和文件名
echo "/tmp/core_%p_%u_%g_%s_%t_%h_%e" > /proc/sys/kernel/core_pattern
#参数列表:
#%p - 添加pid
#%u - 添加当前uid
#%g - 添加当前gid
#%s - 添加导致产生core的信号
#%t - 添加core文件生成时的unix时间
#%h - 添加主机名
#%e - 添加命令名
ipc 这么输入
echo "/home/core_%p_%s_%t_%e" > /proc/sys/kernel/core_pattern
调试命令
启动
gdb a.out # 正常启动
gdb a.out coredump # coredump 调试
gdb a.out pid # 对正在运行的进程调试
gdb # 启动后用 file 命令手动加载
上述的 a.out 需要携带 debug 信息并且未 strip,可以用 file 命令查看。
设置断点
break main # 对函数 main 设置一个断点,可简写为 b main
break 101 # 对源代码的行号设置断点,可简写为 b 101
break basic.c:101 # 对源代码和行号设置断点
break basic.c:foo # 对源代码和函数名设置断点
break *0x00400448 # 对内存地址 0x00400448 设置断点
info breakpoints # 列出当前的所有断点信息,可简写为 info break
delete 1 # 按编号删除一个断点
delete # 删除所有断点
clear # 删除在当前行的断点
clear function # 删除函数断点
clear line # 删除行号断点
clear basic.c:101 # 删除文件名和行号的断点
clear basic.c:main # 删除文件名和函数名的断点
clear *0x00400448 # 删除内存地址的断点
disable 2 # 禁用某断点,但是不删除
enable 2 # 允许某个之前被禁用的断点,让它生效
rbreak {regexpr} # 匹配正则的函数前断点,如 ex_* 将断点 ex_ 开头的函数
tbreak function|line # 临时断点
hbreak function|line # 硬件断点
ignore {id} {count} # 忽略某断点 N-1 次
condition {id} {expr} # 条件断点,只有在条件生效时才发生
condition 2 i == 20 # 2号断点只有在 i == 20 条件为真时才生效
watch {expr} # 对变量设置监视点
info watchpoints # 显示所有观察点
catch exec # 断点在exec事件,即子进程的入口地址
运行
run # 运行程序
run {args} # 以某参数运行程序
run < file # 以某文件为标准输入运行程序
run < <(cmd) # 以某命令的输出作为标准输入运行程序
run <<< $(cmd) # 以某命令的输出作为标准输入运行程序
set args {args} ... # 设置运行的参数
show args # 显示当前的运行参数
continue # 继续运行,可简写为 c 或 cont
step # 单步进入,碰到函数会进去(Step in)
step {count} # 单步多少次
next # 单步跳过,碰到函数不会进入(Step Over)
next {count} # 单步多少次
finish # 运行到当前函数结束(Step Out)
until # 持续执行直到代码行号大于当前行号(跳出循环)
until {line} # 持续执行直到执行到某行
CTRL+C # 发送 SIGINT 信号,中止当前运行的程序
attach {process-id} # 链接上当前正在运行的进程,开始调试
detach # 断开进程链接
kill # 杀死当前运行的函数
查看源代码
list 101 # 显示第 101 行周围 10行代码
list 1,10 # 显示 1 到 10 行代码
list main # 显示函数周围代码
list basic.c:main # 显示另外一个源代码文件的函数周围代码
list - # 重复之前 10 行代码
list *0x22e4 # 显示特定地址的代码
cd dir # 切换当前目录
pwd # 显示当前目录
search {regexpr} # 向前进行正则搜索
reverse-search {regexp} # 向后进行正则搜索
dir {dirname} # 增加源代码搜索路径
dir # 复位源代码搜索路径(清空)
show directories # 显示源代码路径
打印表达式
print {expression} # 打印表达式,并且增加到打印历史
print /x {expression} # 十六进制输出,print 可以简写为 p
print array[i]@count # 打印数组范围
print $ # 打印之前的变量
print *$->next # 打印 list
print $1 # 输出打印历史里第一条
print ::gx # 将变量可视范围(scope)设置为全局
print 'basic.c'::gx # 打印某源代码里的全局变量,(gdb 4.6)
print /x &main # 打印函数地址
x *0x11223344 # 显示给定地址的内存数据
x /nfu {address} # 打印内存数据,n是多少个,f是格式,u是单位大小
x /10xb *0x11223344 # 按十六进制打印内存地址 0x11223344 处的十个字节
x/x &gx # 按十六进制打印变量 gx,x和斜杆后参数可以连写
x/4wx &main # 按十六进制打印位于 main 函数开头的四个 long
x/gf &gd1 # 打印 double 类型
help x # 查看关于 x 命令的帮助
info locals # 打印本地局部变量
info functions {regexp} # 打印函数名称
info variables {regexp} # 打印全局变量名称
ptype name # 查看类型定义,比如 ptype FILE,查看 FILE 结构体定义
whatis {expression} # 查看表达式的类型
set var = {expression} # 变量赋值
display {expression} # 在单步指令后查看某表达式的值
undisplay # 删除单步后对某些值的监控
info display # 显示监视的表达式
show values # 查看记录到打印历史中的变量的值 (gdb 4.0)
info history # 查看打印历史的帮助 (gdb 3.5)
栈帧
where/bt # 当前运行的堆栈列表
frame # 显示当前运行的栈帧
up # 向上移动栈帧(向着 main 函数)
down # 改变堆栈显示的深度
info locals # 打印帧内的相关变量
info args # 打印函数的参数
线程调试
info threads # 查看当前线程和 id
thread {id} # 切换当前调试线程为指定 id 的线程
break {line} thread all # 所有线程在指定行号处设置断点
thread apply {id..} cmd # 指定多个线程共同执行 gdb 命令
thread apply all cmd # 所有线程共同执行 gdb 命令
set schedule-locking ? # 调试一个线程时,其他线程是否执行,off|on|step
set non-stop on/off # 调试一个线程时,其他线程是否运行
set pagination on/off # 调试一个线程时,分页是否停止
set target-async on/off # 同步或者异步调试,是否等待线程中止的信息
信号控制
info signals # 打印信号设置
handle {signo} {actions} # 设置信号的调试行为
handle INT print # 信号发生时打印信息
handle INT noprint # 信号发生时不打印信息
handle INT stop # 信号发生时中止被调试程序
handle INT nostop # 信号发生时不中止被调试程序
handle INT pass # 调试器接获信号,不让程序知道
handle INT nopass # 调试器不接获信号
signal signo # 继续并将信号转移给程序
signal 0 # 继续但不把信号给程序
其它
define command ... end # 定义用户命令
<return> # 直接按回车执行上一条指令
shell {command} [args] # 执行 shell 命令
source {file} # 从文件加载 gdb 命令
quit # 退出 gdb
gdb 调试
https://leec.me/24677bf8961a/