杂项
命令 |
用法 |
说明 |
h[elp] |
help |
显示可用帮助文档 |
|
h CMD |
显示关于指定命令的帮助 |
apr[opos] |
apr REGEXP |
使用正则表达式搜索命令 |
i[nfo] |
info |
显示可展示的信息 |
ENTER |
无命令回车 |
重复执行上一次命令 |
断点
命令 |
用法 |
说明 |
info break |
i b |
显示全部断点和检查点信息 |
info watch |
i wat |
显示全部检查点信息 |
b[reak] |
break |
在当前位置添加断点 |
|
b N |
在指定行添加断点 |
|
b +N |
在当前行偏移 N 行后添加断点 |
|
b FUNC |
在指定函数开头添加断点 |
wa[tch] |
wa EXPR |
添加检查点,当表达式值变化时程序中断 |
rw[atch] |
rw EXPR |
添加检查点,当表达式被读取时程序中断 |
aw[atch] |
aw EXPR |
添加检查点,当表达式被读写时程序中断 |
d[elete] |
delete |
删除全部断点和检查点 |
|
d N |
删除指定编号的断点或检查点 |
cl[ear] |
clear |
删除当前位置的断点 |
|
cl LOC |
删除指定位置的断点 (参数同 b) |
dis[able] |
disable |
使全部断点和检查点失效 |
|
dis N |
使指定编号的断点或检查点失效 |
en[able] |
enable |
使全部断点和检车点生效 |
|
en N |
使指定编号的断点或检查点生效 |
运行
命令 |
用法 |
说明 |
r[un] |
run [ARGS] |
开始运行程序 |
file |
file FILE |
使用 FILE 为被调试程序 |
at[tach] |
at PID |
将调试器 attach 到已经在运行的程序 |
q[uit] |
quit |
退出 GDB |
Ctrl-C |
按下组合键 |
终止正在运行的程序 |
n[ext] |
n [N] |
单步运行 |
s[tep] |
s [N] |
单步运行,会进入被调用函数 |
fin[ish] |
finish |
执行完当前函数 |
c[ontinue] |
c [N] |
继续执行程序直到下一 (N) 个断点 |
adv[ance] |
adv LOC |
执行到指定位置 (参数同 b) 或者当前函数结束 |
汇编相关
命令 |
用法 |
说明 |
disas[semble] |
disassemble |
显示反汇编指令 |
n[ext]i |
ni [N] |
单步指令运行 |
s[tep]i |
si [N] |
单步指令运行,会进入被调用函数 |
变量
命令 |
用法 |
说明 |
p[rint] |
p EXPR |
打印表达式值 |
|
p *PTR |
打印指针指向的变量值 |
|
p VAR@N |
打印从 VAR 起的 N 个连续变量 |
|
p/FMT EXPR |
格式化打印 |
pt[ype] |
pt VAR |
显示变量类型 |
info local |
i lo |
显示所有局部变量 |
info args |
i ar |
显示所有函数参数 |
disp[lay] |
disp [/FMT] EXPR] |
持续显示表达式值 |
und[isplay] |
und N |
取消持续显示 |
info display |
i disp |
查看所有被持续显示的表达式 |
set |
set VAR |
设置变量的值 |
print 支持的 FMT 格式:
x (16进制)、z (前面填充0的16进制)、d (10进制)、u (无符号10进制)、o (8进制)、t (2进制,Two)、f (浮点数)、a (地址)、c (字符)、s (字符串)
栈回溯
命令 |
用法 |
说明 |
b[ack]t[race] |
backtrace / bt |
显示当前函数调用栈 |
f[rame] |
frame |
显示当前 (调用栈) 位置 |
up |
up |
在当前函数调用栈中上移一层 |
do[wn] |
do |
在当前函数调用栈中下移一层 |
多线程程序中 thread apply all bt
可用于显示所有线程的函数调用栈。
多线程
命令 |
用法 |
说明 |
i thread |
i thread |
查看所有线程状态 |
t [t_id] |
t N |
切换到指定线程 |
查看源码
命令 |
用法 |
说明 |
l[ist] |
list |
显示当前位置附近的源码 |
|
l *$rip |
显示当前位置附近的源码 |
|
l N |
显示指定位置 (行) 附近的源码 |
|
l CLASS/FUNC |
显示指定类/函数源码 |
TUI (Text User Interface) 模式
三种进入方法:
- 启动 GDB 时加入
-tui
参数
- 在 GDB 命令行输入
tui enable
- 在 GDB 命令行中按下
Ctrl+X, A
组合键
命令 |
用法 |
说明 |
la[yout] |
la src |
显示源码视图 |
|
la asm |
显示反汇编指令视图 |
|
la regs |
显示寄存器视图 |
|
la prev |
显示前一个视图 |
|
la next |
显示后一个视图 |
focus |
fs [WIN | prev | next] |
移动窗口焦点 |
info win |
i wi |
显示窗口信息 |
关于窗口焦点:如果除了 cmd 之外的窗口获得了焦点,则可以通过方向键或者在命令行中输入 -
, +
, <
, >
来移动显示。
Coredump
在终端执行 ulimit -a
命令查看系统的用户限制中 -c
一项的值,如果是 0 则表示禁止生成 corefile,我们可以将其设为 unlimited
,即执行 ulimit -c unlimited
(注意:ulimit 设置只对当前终端有效,如果想一直生效,可以把该命令写入 /etc/profile 文件)。
默认 corefile 生成在当前目录下,文件名为 core,其生成模板定义在 /proc/sys/kernel/core_pattern
中,可自定义生成模板,比如:
sudo bash -c 'echo "/home/core-%e-%p-%s-%t" > /proc/sys/kernel/core_pattern'
生成模板中支持的变量有:
-
%e
可执行文件名 (无路径)
-
%E
可执行文件完整路径
-
%i
出 core 的线程 TID
-
%p
出 core 的进程 PID
-
%s
导致 core 的信号数字
-
%t
时间戳
-
%u
出 core 的进程 UID
加载 corefile 来分析 core 原因:gdb EXEFILE COREFILE
参考资料