GDB
GDB 基本命令¶
命令 | 描述 |
---|---|
next |
单步执行 |
step |
单步进入 |
finish or fin |
跳出当前函数 |
continue |
继续执行到下一个断点 |
until |
继续运行到指定位置 |
- 跳出当前函数
finish
: Continue running until just after function in the selected stack frame returns. Print the returned value (if any).
运行带参数程序¶
gdb --args 正常程序+参数
- 进入gdb后运行
set args 参数
break断点¶
f
打印当前文件 ,便于打断点info breakpoints
查看已经的断点del 3
删除NUM=3的第三个断点
给某个结构体内的函数全部上break
打印信息¶
- 参数
show args
- 局部变量
info locals
- 修改变量
p result=20
- 函数调用栈
bt
多线程¶
info threads
- 切换线程
thread 2
- 打印线程堆栈
thread apply all 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
”:
内存地址内容¶
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
打印寄存器值(表格)¶
GDB segmentation fault¶
段错误定位
# ulimit -c 显示核心转储文件大小的最大值
ulimit -c unlimited # 打开
ulimit -c 0 # 关闭
# 改变core存储位置
#%e 打印线程name
#%p 打印进程id
#%h 打印主机名
#%t 打印时间
echo '/tmp/core-%e.%p.%h.%t' > /proc/sys/kernel/core_pattern
c++程序
- 执行编译加入-g的SLIC程序,产生core文件
- 然后执行进gdb
(gdb) bt #0 0x00002af6047e4a4b in fgets () from /lib64/libc.so.6 #1 0x000000000040450a in LoadPPM (filename=0x407e63 "input_image.ppm", data=0x7ffecda55cc8, width=0x7ffecda55cc4, height=0x7ffecda55cc0) at SLIC_raw.cpp:692 #2 0x00000000004049e1 in main (argc=1, argv=0x7ffecda55de8) at SLIC_raw.cpp:794
python 程序
问题¶
define内容难以解析¶
gef 界面¶
效果¶
会打印详细的信息
安装gef¶
需要GDB10以上
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 不太兼容