杂项
命令 | 用法 | 说明 |
---|---|---|
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