GDB调试

  1. 安装DebugInfo

https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/gdb.html

对多线程的支持
set follow-fork-mode [parent|child]
set detach-on-fork [on|off]

follow-fork-mode detach-on-fork 说明
parent on 只调试主进程
child on 只调试子进程
parent off 同时调试父子进程, gdb跟踪父进程, 子进程阻塞在fork位置
child off 同上 gdb跟踪子进程, 父进程阻塞

进程间切换

命令 功能
info inferiors 查询正在调试的进程
inferior <number> 切换进程

栈相关

命令 功能
up/down 改变堆栈的显示深度
info stack 查看所有栈的信息
backtrace 缩写bt 同上
info frame 显示当前栈的详细信息
frame 缩写是f 显示当前栈的简单信息
frame n 切换到 第n层栈
运行命令 缩写 功能
run r 运行程序
continue c 继续执行到下有一个断点处
next n 单步跟踪, 不进入函数
step s 会进入函数
until 运行程序直到退出循环体
until + 行号 运行至某行
finish 运行程序, 直到当前函数完成返回, 并打印函数返回时的堆栈地址和返回以及参数等信息
call 函数(参数) 调试程序中的可见参数, 并传递参数
quit q 退出
设置断点 缩写 功能
break n b n 在第n行设置断点, b xx.cpp:500(xx.cpp文件第500行)
b f if a>b 在函数f 设置条件断点
b n if a>b 在行号n 设置条件断点
break func b func 在函数func()的入口处设置断点
delete 断点号n 删除第n个断点
disable 断点号n 暂停第n个断点
enable 断点号n 开始第n的断点
clear 行号n 清除第n行的断点
info b 显示断点设置情况
delete breakpoints 清除所有断点
查看源代码 缩写 功能
list l 默认显示10行
list 行号 以行号为中心的前后十行代码
list 函数名 列出函数名所在函数的代码
list 不带参数, 接着上一次的list命令输出下边的内容
打印表达式 功能
print p
p a 显示a的值
p ++a a的值
p func(22) 以整数22作为参数调用 后打印
p func(a) 将变量a作为参数
display 表达式 每次单步运行后就打印表达式的值
watch 表达式 设置检视点, 一旦被监视的表达式值改变就强行终止正在被调试的程序
whatis 查询变量或函数
info function 查询函数
info local 显示当前堆栈页的所有变量
查询运行信息 功能
where/bt 当前运行的堆栈列表
bt backtrace 显示当前的调用堆栈
set args [args] 指定程序运行参数
show args 查看程序参数
info program 查看程序是否运行, 进程号, 被暂停原因

安装DebugInfo

cat /etc/yum.repos.d/CentOS-Debug.repo

[debug]
name=CentOS-$releasever - DebugInfo
baseurl=http://debuginfo.centos.org/$releasever/$basearch/
gpgcheck=0
enabled=1 # 重点是这个 
protect=1
priority=1


安装 kernel-debuginfo
yum --enablerepo=base-debug install -y kernel-debuginfo-$(uname -r)

安装glibc, 提示缺少其他的也是如此安装
debuginfo-install glibc