GDB的命令
一、断点相关
1. breakInfo:根据一定的条件暂停程序的运行
命令 |
作用 |
break |
下一个指令处设置断点 |
break [file]:function |
在 file 文件的 function 函数入口设置断点 |
break [file]:line |
在 file 文件的第 line 行设置断点 |
break [+-] offset |
在当前偏移量 [+-] offset 处设置断点 |
break *addr |
在地址为 addr 处设置断点 |
break ... if expr |
设置条件断点,条件表达式 expr 为真时 |
info breakpoints |
查看断点 |
ignore n count |
对编号为 n 的断点忽略 count 次 |
clear |
清除所有断点 |
clear function |
清除所有位于 function 内的断点 |
clear [file]:line |
清除文件 file 的 line 行断点 |
clear n |
删除编号为 n 的断点 |
enable n |
启用编号为 n 的断点 |
disable n |
禁用编号为 n 的断点 |
save breakpoints file |
保存断点信号到 file 文件中 |
source file |
从 file 文件中导入断点信息 |
2. watchpoint:监控当监听的表达式或者变量变化时,程序暂停运行
命令 |
作用 |
watch variable |
监控 variable 变量 |
watch var1+var2 |
监控表达式值变化 |
rwatch variable |
监控数据读变化,仅支持硬件实现 |
awatch variable |
监控数据读写变化,仅支持硬件实现 |
info watchpoints |
查看监控断点列表 |
set can-use-hw-watchpoints 0 |
强制 watch 使用软件实现 |
print &variable |
查看变量的内存地址 |
watch *(type*)address |
监控类型为 type 的 address 地址 |
watch -l variable |
指定 location 参数 |
watch variable thread 1 |
当线程 1 修改 variable 值时中断 |
3. cathcpoint:监控信号产生
命令 |
含义 |
catch fork |
调用fork时中断 |
tcatch fork |
设置的断点只触发一次 |
catch syscall ptrace |
为 ptrace 系统调用设置断点 |
二、命令行
命令 |
左右 |
run arglist |
运行程序,arglist 是程序的参数列表 |
set args arglist |
指定启动命令行参数 |
set args |
指定空的列表参数 |
show args |
打印命令行列表 |
三、程序栈
命令 |
作用 |
backtrace [n] |
打印第 n 个帧栈 |
frame [n] |
选择第 n 个帧栈,如果不存在则打印当前帧栈 |
up n |
选择当前帧栈编号 +n 的帧栈 |
down n |
选择当前帧栈编号 -n 的帧栈 |
info frame [addr] |
打印当前选择的帧栈 |
info args |
当前帧栈的参数列表 |
info local |
当前帧栈的局部变量 |
四、多进程
命令 |
作用 |
info inferiors |
查看进程列表 |
attach pid |
绑定进程id |
inferior num |
切换到指定进程进行调试 |
print $_exitcode |
显示程序退出时的返回值 |
set follow-fork-mode child |
追踪子进程 |
set follow-fortk-mode parent |
追踪父进程 |
set detach-on-fork on |
fork 调用时只追踪其中一个 |
set detach-on-fork off |
fork 调用时会同时追踪父子进程 |
五、多线程
命令 |
作用 |
info threads |
查看线程列表 |
print $_thread |
显示当前正在调试的线程编号 |
set scheduler-locking on |
调试一个线程时,其他线程暂停执行 |
set scheduler-locking off |
调试一个线程时,其他线程同步执行 |
set scheduler-locking step |
仅用 step 调试时其他线程不执行,用其他命令如 next 时其他线程执行 |
六、打印输出
1. 打印变量
命令 |
作用 |
whatis variable |
查看变量类型 |
ptype variable |
查看变量详细的类型信息 |
info variables var |
查看定义该变量的文件,不支持局部变量 |
2. 打印字符串
命令 |
作用 |
x/s str |
打印字符串 |
set print element 0 |
打印不限制字符串长度或不限制数组长度 |
call printf(“%s\n”,xxx) |
打印不会含有多余转移符的字符串 |
printf “%s\n”, xxx |
同上 |
3. 打印数组
命令 |
作用 |
print *array@10 |
打印从数组开头连续10个元素的值 |
print array[60]@10 |
打印 array 数组下标从 60 开始的 10 个元素,即第 60~69 个元素 |
set print array-indexes on |
打印数组元素时,同时打印数组的下标 |
4. 打印指针
命令 |
作用 |
print ptr |
查看该指针指向的类型及指针地址 |
print *(struct xxx*)ptr |
查看指向结构体的内容 |
5. 打印指定内存地址的值
命令 |
作用 |
x/8xb |
以16进制打印数组 array 的前 8 个 byte 的值 |
x/8xw array |
以 16 进制打印数组 array 的前 16 个 word 的值 |
6. 打印局部变量
命令 |
左右 |
info locals |
打印当前函数局部变量的值 |
backtrace full |
打印当前栈帧各个函数的局部变量值,可以缩写为 bt |
bt full n |
从内到外显示 n 个栈帧及其局部变量 |
bt full -n |
从外到内显示 n 个栈帧及其局部变量 |
7. 打印结构体
命令 |
作用 |
set print pretty on |
每行只显示结构体的一名成员 |
set print null-stop |
不显示’\000’这种数据 |
七、函数跳转
命令 |
作用 |
set step-mode on |
不跳过不含调试信息的函数,可以显示和调试汇编代码 |
finish |
执行完当前函数并打印返回值,然后触发中断 |
return 0 |
不再执行后面的指令,直接返回,可以指定返回值 |
call printf(“%s\n”,str) |
调用printf函数,打印字符串 |
print func() |
调用func函数(call 命令也行) |
set var variable=xxx |
设置变量variable的值为xxx |
set {type}address = xxx |
给存储地址为 address,类型为 type 的变量赋值 |
info frame |
显示函数堆栈信息(堆栈帧地址、指令寄存器的值等) |
八、其他
1. 图形化
命令 |
作用 |
layout src |
显示源码窗口 |
layout asm |
显示汇编窗口 |
layout split |
显示源码和汇编窗口 |
layout regs |
显示寄存器+源码或者汇编窗口 |
winhegiht src+5 |
源码窗口高度增加 5 行 |
winheight asm -5 |
汇编窗口高度减少 5 行 |
winheight cmd + 5 |
控制台窗口高度增加 5 行 |
winheight regs – 5 |
寄存器窗口高度减少 5 行 |
2. 汇编相关
命令 |
作用 |
disassemble function |
查看函数的汇编代码 |
disassemble /mr function |
同时比较函数源代码和汇编代码 |
3. 调试和保存 core 文件
命令 |
作用 |
file exec_file *#* |
加载可执行文件的符号表信息 |
core core_file |
加载 core-dump 文件 |
gcore core_file |
生成 core-dump 文件,记录当前进程的状态 |