4.1 为调试而编译
-g
-g -o 编译器优化,有些没用过的变量可能被优化掉
run | r
4.3 程序参数
gdb --args test 111
show args 显示在启动时传入的参数
set args 为你的下一次执行程序设置参数
set args 111
4.4 程序环境
show paths 显示当前PATH
path directory 新增路径到PATH
show environment PATH
set environment PATH=xxx
unset environment PATH
4.5 程序的工作目录
cd directory
pwd
4.7 调试一个已经在运行的进程
shell ps -ef | grep xxx
attach process-id
detach
4.8 杀死子进程
kill
4.9 调试多线程进程
多线程共享一个地址空间,即他们可以检查和修改同一个变量;
每个线程有它自己的寄存器和执行栈,也可能有自己的存储空间.
thread threadno 切换线程
info threads 查询线程
thread apply [threadno] [all] args 在一个或多个线程上执行命令,如线程特定断点
thread apply all args
thread apply xxx xxx args
set print thread-events 控制线程开始和结束时打印消息
set print thread-events on
set print thread-events off
4.10 调试多个程序
程序创建子进程时,GDB会继续调试子进程,而子进程不受影响.
(1)方法1
在fork调用后的子进程代码里调用sleep,ps得到pid,再gdb attach到子进程
(2)方法2
Linux系统上,GDB提供调试用fork或vfork调用创建子进程的程序的支持。
set follow-fork-mode
set follow-fork-mode mode
mode:
parent fork之后调试原进程
child fork之后调试新进程
show follow-fork-mode
设置GDB在fork之后是否detach进程中的一个,或继续保留控制控制这两个进程。
set detach-on-fork
set detach-on-fork mode
mode:
on 子进程或父进程(依赖于follow-fork-mode)会被detach然后独立运行
off 两个进程都由GDB控制。子进程或父进程(依赖于follow-fork-mode)被调试,另外一个则被挂起。
show detach-on-fork
可以用info forks来查看GDB里创建的子进程,用fork来从一个进程切换到另一个进程。
info forks
fork fork-id
process process-id 切换到process-id指定的进程
detach fork fork-id 结束调试进程,进程被允许继续独立运行
delete fork fork-id 杀死调试进程
4.11 为跳转设置书签
Linux上,GDB可以保存一个程序状态的快照,称为检查点,以后可以跳回。这样可以不需要重新启动程序复现!!!
checkpoint 保存被调试程序当前执行状态的快照
info checkpoints
restart checkpoint-id
delete checkpoint checkpoint-id