基本操作
生成包含调试信息的可执行文件
gcc -g test.c -o test
进入gdb
调试
gdb test
查看所载入的文件
(gdb) l
设置断点
在程序第六行设置断点(breakpoint
)
(gdb) b 6
查看断点
(gdb) info b
运行程序
(gdb) r
查看栈信息
(gdb) bt
查看变量值
variable
为变量名称
(gdb) p variable
单步运行
单步运行有两种,”n
“(next
)和”s
"(step
),“s
“可以调试程序直接进入调用函数,而”n
"不行。
(gdb) n
or
(gdb) s
恢复程序运行
(gdb) c
工作环境相关命令
gdb
工作环境相关命令
命令格式 | 含义 |
---|---|
set args 运行时的参数 | 指定运行时参数,如 set args 2 |
show args | 查看设置好的运行参数 |
Path dir | 设定程序的运行路径 |
show paths | 查看程序的运行路径 |
set environment var [=value] | 设置环境变量 |
show environment [var] | 查看环境变量 |
cd dir | 进入dir 目录 |
Pwd | 显示当前目录 |
shell command | 运行shell 的command 命令 |
设置断点与恢复命令
gdb
设置断点与恢复相关命令
命令格式 | 含义 |
---|---|
info b | 查看所有断点 |
break[文件名:]行号或函数名<条件表达式> | 设置断点 |
tbreak[文件名:]行号或函数名<条件表达式> | 设置临时断点,到达后自动删除 |
delete[断点号] | 删除指定断点,其断点号为"info b "中的第一栏。若缺省断点号默认删除所有断点。 |
disable[断点号] | 停止指定断点,可以查看,功能与delete 类似。 |
enable[断点号] | 激活断点。 |
condition[断点号]<条件表达式> | 修改对应断点的条件 |
ignore[断点号] | 忽略对应断点num 次 |
Step | 单步恢复程序运行,且进入函数调用 |
Next | 单步恢复程序运行,但不进入函数调用 |
Finish | 运行程序,直到当前函数完成返回 |
C | 继续执行函数,直到函数结束或遇到新的断点 |
gdb中源码查看相关命令
gdb
中源码查看相关命令
命 令 格 式 | 含义 |
---|---|
list <行号> | <函数名> | 查看指定位置代码 |
file [文件名] | 加载指定文件 |
forward-search 正则表达式 | 源代码的前向搜索 |
reverse-search 正则表达式 | 源代码的后向搜索 |
dir DIR | 将路径 DIR 添加到源文件搜索的路径的开头 |
show directories | 显示源文件的当前搜索路径 |
info line | 显示加载到 gdb 内存中的代码 |
gdb中查看运行数据相关命令
gdb
查看运行数据相关命令
命 令 格 式 | 含义 |
---|---|
print 表达式 | 变量 |
x <n/f/u> | 查看内存变量内容。其中 n 为整数表示显示内存的长度,f 表示显示的格式,u 表示从当前地址往后请求显示的字节数 |
display 表达式 | 设定在单步运行或其他情况中,自动显示的对应表达式的内容 |
backtrace | 查看当前栈的情况,即可以查到哪些被调用的函数尚未返回 |
一般来说,GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中的位的情况。要做到这样,你可以使用GDB的数据显示格式:
GDB
数据显示格式
符号参数 | 含义 |
---|---|
x | 按十六进制格式显示变量。 |
d | 按十进制格式显示变量。 |
u | 按十六进制格式显示无符号整型。 |
o | 按八进制格式显示变量。 |
t | 按二进制格式显示变量。 |
a | 按十六进制格式显示变量。 |
c | 按字符格式显示变量。 |
f | 按浮点数格式显示变量。 |
调试C语言文件
tb.c
命令行输入:
linux> gcc -O1 -o tb tb.c
linux> gdb tb
进入gdb
.
如图所示:
设置断点1:
gdb> b vframe
设置断点2:
gdb> b main
(b
=break
)
运行文件:
gdb> r
到达第二个断点停止。如图(r
= run
):
反汇编main
函数:
gdb> disassemble main
如图:
设置调试运行显示汇编指令:
gdb> display /5i $pc
5i
表示显示5
条汇编指令。如图:
查看各寄存器
gdb> i r
如图(i r
= info registers
):
逐条运行
gdb> si
如图(si
= stepi
):
使用examine命令来查看内存地址中的值。
x(简写是x)命令的语法如下所示:
x/<n/f/u> <addr>
n、f、u
是可选的参数。
符号参数 | 含义 |
---|---|
n | 正整数。表示显示内存单元的个数。 |
f | 显示格式。如果所指的是字符串,则为s ;如果为指令地址,则为i 。 |
u | 表示从当前地址往后请求的字节数,默认为4 个bytes 。b 表示单字节;h 表示双字节;w 表示四字节;g 表示八字节。 |
示例:
x/2x $(rsp+16)
⟹
\implies
⟹打印输出16(%rsp)
的值
文章目录
参考文章
参考:《嵌入式Linux应用程序开发标准教程》作者:华清远见