GDB
GDB 基本命令¶
- -next单步执行
- -step单步进入
- finish 跳出当前函数
- 跳出当前函数 finish: Continue running until just after function in the selected stack frame returns. Print the returned value (if any). This command can be abbreviated as fin.
- -continue继续执行到下一个断点
- -until继续运行到指定位置
运行带参数程序¶
gdb --args 正常程序+参数
- 进入gdb后运行
set args 参数
break断点¶
- f 打印当前文件 ,便于打断点
- info breakpoints 查看已经的断点
- del 3 删除NUM=3的第三个断点
给某个结构体内的函数全部上break¶
GDB 打印信息¶
- 参数
show args
- 局部变量
info locals
- 修改变量
p result=20
- 函数调用栈
bt
打印结构体class¶
gef➤ p -raw-values off -- this->TotalCycles
gef➤ p this
$11 = (llvm::mca::SummaryView * const) 0x7fffffffcc08
gef➤ p *this
打印指针变量¶
- 二维指针
p **matrix@3@3
- 一维指针
p *matrix@3
- 或者转换为数组
p *(int *)matrix@3
- 或者转换为数组
p *(int (*)[3])matrix
打印数组¶
可以看到打印了array
数组第60~69个元素的值。如果要打印从数组开头连续元素的值,也可使用这个命令:“p *array@num
”:
GDB中查看指定内存地址内容的指令¶
examine命令(简写是x)
格式:x /nfu <addr>
说明:
- x是examine的缩写
- n表示要显示的内存单元的个数
- f表示显示方式,可取如下值
- x按十六进制格式显示变量。
- d按十进制格式显示变量。
- u按十进制格式显示无符号整型。
- o按八进制格式显示变量。
- t按二进制格式显示变量。
- a按十六进制格式显示变量。
- i指令地址格式
- c按字符格式显示变量。
- f按浮点数格式显示变量。
- u表示一个地址单元的长度
- b表示单字节,
- h表示双字节,
- w表示四字节,
- g表示八字节
example:
(gdb) x 0x8049948
0x8049948: 0x20726f46
(gdb) x/s 0x8049948
0x8049948: "For NASA,space is still a high priority."
(gdb) x/4 0x7fffe536dbc0 # display 4 bytes info?
0x7fffe536dbc0: 0x0 0x0 0x9d835 0x0
打印寄存器值(表格)¶
gef 界面¶
效果¶
安装gef¶
bash -c "$(curl -fsSL http://gef.blah.cat/sh)"
# 没有网,手动下 https://gef.blah.cat/py ,替换
$ wget -O ~/.gdbinit-gef.py -q https://gef.blah.cat/py
$ echo source ~/.gdbinit-gef.py >> ~/.gdbinit
注意:gdbtui 与 gef 不太兼容
需要进一步的研究学习¶
之前gdbtui的使用写在notion上了
https://shaojiemike.notion.site/GDB-d53a1be0b6324234a2ae43b7c27a23b8## 遇到的问题 暂无
开题缘由、总结、反思、吐槽~~¶
参考文献¶
无