跳转至

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

rbreak file.cpp:.*TemplateClass.*

打印信息

  • 参数 show args
  • 局部变量 info locals
  • 修改变量 p result=20
  • 函数调用栈 bt

多线程

  • info threads
  • 切换线程 thread 2
  • 打印线程堆栈 thread apply all bt

代码信息

list # 代码,需要-g
info line
info source
where
disas # 汇编

结构体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}

内存地址内容

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

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++程序
  1. 执行编译加入-g的SLIC程序,产生core文件
  2. 然后执行进gdb
    gdb SLIC core.199048
       bt
    
    (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 程序

# add debug file for gdb
cd /compile_path/build
cp dbg/libtorch_npu.so.debug /path2conda/site-packages/torch_npu/lib
# gdb need the same python env
conda activate xxx
gdb python core_xxx
    # bt

问题

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 不太兼容

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

参考文献


  1. notion的笔记之前gdbtui的使用写在notion上了