-
Notifications
You must be signed in to change notification settings - Fork 2.1k
/
gdb.txt
272 lines (220 loc) · 13.7 KB
/
gdb.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
##############################################################################
# GDB CHEATSHEET (中文速查表) - by skywind (created on 2018/02/20)
# Version: 9, Last Modified: 2023/06/26 14:31
# https://github.com/skywind3000/awesome-cheatsheets
##############################################################################
##############################################################################
# 启动 GDB
##############################################################################
gdb object # 正常启动,加载可执行
gdb object core # 对可执行 + core 文件进行调试
gdb object pid # 对正在执行的进程进行调试
gdb # 正常启动,启动后需要 file 命令手动加载
gdb -tui # 启用 gdb 的文本界面(或 ctrl-x ctrl-a 更换 CLI/TUI)
##############################################################################
# 帮助信息
##############################################################################
help # 列出命令分类
help running # 查看某个类别的帮助信息
help run # 查看命令 run 的帮助
help info # 列出查看程序运行状态相关的命令
help info line # 列出具体的一个运行状态命令的帮助
help show # 列出 GDB 状态相关的命令
help show commands # 列出 show 命令的帮助
##############################################################################
# 断点
##############################################################################
break main # 对函数 main 设置一个断点,可简写为 b main
break 101 # 对源代码的行号设置断点,可简写为 b 101
break basic.c:101 # 对源代码和行号设置断点
break basic.c:foo # 对源代码和函数名设置断点
break *0x00400448 # 对内存地址 0x00400448 设置断点
info breakpoints # 列出当前的所有断点信息,可简写为 info break
delete 1 # 按编号删除一个断点
delete # 删除所有断点
clear # 删除在当前行的断点
clear function # 删除函数断点
clear line # 删除行号断点
clear basic.c:101 # 删除文件名和行号的断点
clear basic.c:main # 删除文件名和函数名的断点
clear *0x00400448 # 删除内存地址的断点
disable 2 # 禁用某断点,但是不删除
enable 2 # 允许某个之前被禁用的断点,让它生效
rbreak {regexpr} # 匹配正则的函数前断点,如 ex_* 将断点 ex_ 开头的函数
tbreak function|line # 临时断点
hbreak function|line # 硬件断点
ignore {id} {count} # 忽略某断点 N-1 次
condition {id} {expr} # 条件断点,只有在条件生效时才发生
condition 2 i == 20 # 2号断点只有在 i == 20 条件为真时才生效
watch {expr} # 对变量设置监视点
info watchpoints # 显示所有观察点
catch exec # 断点在exec事件,即子进程的入口地址
##############################################################################
# 运行程序
##############################################################################
run # 运行程序
run {args} # 以某参数运行程序
run < file # 以某文件为标准输入运行程序
run < <(cmd) # 以某命令的输出作为标准输入运行程序
run <<< $(cmd) # 以某命令的输出作为标准输入运行程序
set args {args} ... # 设置运行的参数
show args # 显示当前的运行参数
continue # 继续运行,可简写为 c 或 cont
step # 单步进入,碰到函数会进去(Step in)
step {count} # 单步多少次
next # 单步跳过,碰到函数不会进入(Step Over)
next {count} # 单步多少次
finish # 运行到当前函数结束(Step Out)
until # 持续执行直到代码行号大于当前行号(跳出循环)
until {line} # 持续执行直到执行到某行
CTRL+C # 发送 SIGINT 信号,中止当前运行的程序
attach {process-id} # 链接上当前正在运行的进程,开始调试
detach # 断开进程链接
kill # 杀死当前运行的函数
##############################################################################
# 栈帧
##############################################################################
bt # 打印 backtrace (命令 where 是 bt 的别名)
frame # 显示当前运行的栈帧
up # 向上移动栈帧(向着 main 函数)
down # 向下移动栈帧(远离 main 函数)
info locals # 打印帧内的相关变量
info args # 打印函数的参数
##############################################################################
# 代码浏览
##############################################################################
list 101 # 显示第 101 行周围 10行代码
list 1,10 # 显示 1 到 10 行代码
list main # 显示函数周围代码
list basic.c:main # 显示另外一个源代码文件的函数周围代码
list - # 重复之前 10 行代码
list *0x22e4 # 显示特定地址的代码
cd dir # 切换当前目录
pwd # 显示当前目录
search {regexpr} # 向前进行正则搜索
reverse-search {regexp} # 向后进行正则搜索
dir {dirname} # 增加源代码搜索路径
dir # 复位源代码搜索路径(清空)
show directories # 显示源代码路径
##############################################################################
# 浏览数据
##############################################################################
print {expression} # 打印表达式,并且增加到打印历史
print /x {expression} # 十六进制输出,print 可以简写为 p
print array[i]@count # 打印数组范围
print $ # 打印之前的变量
print *$->next # 打印 list
print $1 # 输出打印历史里第一条
print ::gx # 将变量可视范围(scope)设置为全局
print 'basic.c'::gx # 打印某源代码里的全局变量,(gdb 4.6)
print /x &main # 打印函数地址
x *0x11223344 # 显示给定地址的内存数据
x /nfu {address} # 打印内存数据,n是多少个,f是格式,u是单位大小
x /10xb *0x11223344 # 按十六进制打印内存地址 0x11223344 处的十个字节
x/x &gx # 按十六进制打印变量 gx,x和斜杆后参数可以连写
x/4wx &main # 按十六进制打印位于 main 函数开头的四个 long
x/gf &gd1 # 打印 double 类型
help x # 查看关于 x 命令的帮助
info locals # 打印本地局部变量
info functions {regexp} # 打印函数名称
info variables {regexp} # 打印全局变量名称
ptype name # 查看类型定义,比如 ptype FILE,查看 FILE 结构体定义
whatis {expression} # 查看表达式的类型
set var = {expression} # 变量赋值
display {expression} # 在单步指令后查看某表达式的值
undisplay # 删除单步后对某些值的监控
info display # 显示监视的表达式
show values # 查看记录到打印历史中的变量的值 (gdb 4.0)
info history # 查看打印历史的帮助 (gdb 3.5)
##############################################################################
# 目标文件操作
##############################################################################
file {object} # 加载新的可执行文件供调试
file # 放弃可执行和符号表信息
symbol-file {object} # 仅加载符号表
exec-file {object} # 指定用于调试的可执行文件(非符号表)
core-file {core} # 加载 core 用于分析
##############################################################################
# 信号控制
##############################################################################
info signals # 打印信号设置
handle {signo} {actions} # 设置信号的调试行为
handle INT print # 信号发生时打印信息
handle INT noprint # 信号发生时不打印信息
handle INT stop # 信号发生时中止被调试程序
handle INT nostop # 信号发生时不中止被调试程序
handle INT pass # 调试器接获信号,不让程序知道
handle INT nopass # 调试器不接获信号
signal signo # 继续并将信号转移给程序
signal 0 # 继续但不把信号给程序
##############################################################################
# 线程调试
##############################################################################
info threads # 查看当前线程和 id
thread {id} # 切换当前调试线程为指定 id 的线程
break {line} thread all # 所有线程在指定行号处设置断点
thread apply {id..} cmd # 指定多个线程共同执行 gdb 命令
thread apply all cmd # 所有线程共同执行 gdb 命令
set schedule-locking ? # 调试一个线程时,其他线程是否执行,off|on|step
set non-stop on/off # 调试一个线程时,其他线程是否运行
set pagination on/off # 调试一个线程时,分页是否停止
set target-async on/off # 同步或者异步调试,是否等待线程中止的信息
##############################################################################
# 进程调试
##############################################################################
info inferiors # 查看当前进程和 id
inferior {id} # 切换某个进程
kill inferior {id...} # 杀死某个进程
set detach-on-fork on/off # 设置当进程调用fork时gdb是否同时调试父子进程
set follow-fork-mode parent/child # 设置当进程调用fork时是否进入子进程
##############################################################################
# 汇编调试
##############################################################################
info registers # 打印普通寄存器
info all-registers # 打印所有寄存器
print/x $pc # 打印单个寄存器
stepi # 指令级别单步进入,可以简写为 si
nexti # 指令级别单步跳过,可以简写为 ni
display/i $pc # 监控寄存器(每条单步完以后会自动打印值)
x/x &gx # 十六进制打印变量
info line 22 # 打印行号为 22 的内存地址信息
info line *0x2c4e # 打印给定内存地址对应的源代码和行号信息
disassemble {addr} # 对地址进行反汇编,比如 disassemble 0x2c4e
##############################################################################
# 历史信息
##############################################################################
show commands # 显示历史命令 (gdb 4.0)
info editing # 显示历史命令 (gdb 3.5)
ESC-CTRL-J # 切换到 Vi 命令行编辑模式
set history expansion on # 允许类 c-shell 的历史
break class::member # 在类成员处设置断点
list class:member # 显示类成员代码
ptype class # 查看类包含的成员
print *this # 查看 this 指针
##############################################################################
# 其他命令
##############################################################################
define command ... end # 定义用户命令
<return> # 直接按回车执行上一条指令
shell {command} [args] # 执行 shell 命令
source {file} # 从文件加载 gdb 命令
quit # 退出 gdb
##############################################################################
# GDB 前端
##############################################################################
gdb-tui 使用 gdb -tui 启动(或 ctrl-x ctrl-a 更换 CLI/TUI)
cgdb http://cgdb.github.io/
emacs http://gnu.org/software/emacs
gdbgui https://github.com/cs01/gdbgui
vimspector https://github.com/puremourning/vimspector
termdebug https://github.com/vim/vim
GDB 图形化前端评测 http://www.skywind.me/blog/archives/2036
##############################################################################
# References
##############################################################################
https://sourceware.org/gdb/current/onlinedocs/gdb/
https://kapeli.com/cheat_sheets/GDB.docset/Contents/Resources/Documents/index
http://www.yolinux.com/TUTORIALS/GDB-Commands.html
https://gist.github.com/rkubik/b96c23bd8ed58333de37f2b8cd052c30
http://security.cs.pub.ro/hexcellents/wiki/kb/toolset/gdb
# vim: set ts=4 sw=4 tw=0 noet ft=gdb: