跳转至

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

rbreak file.cpp:.*TemplateClass.*

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

打印数组

(gdb) p array[60]@10
$9 = {60, 61, 62, 63, 64, 65, 66, 67, 68, 69}

可以看到打印了array数组第60~69个元素的值。如果要打印从数组开头连续元素的值,也可使用这个命令:“p *array@num”:

(gdb) p *array@10
$2 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

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

打印寄存器值(表格)

layout split
layout regs
tui reg general

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## 遇到的问题 暂无

开题缘由、总结、反思、吐槽~~

参考文献