This is my study note of GDB.

GDB的概念

GDB,全称 GNU symbolic debugger,简称 GDB调试器,是 Linux 平台下最常用的一款程序调试器。

GDB基本用法

检查GDB版本

1
gdb -v
命令 简写形式 说明
backtrace bt、where 显示backtrace
break b 设置断点
continue c、cont 继续执行
delete d 删除断点
finish 运行到函数结束
info breakpoints 显示断点信息
next n 执行下一行
print p 显示表达式
run r 运行程序
step s 一次执行一行,包括函数内部
x 显示内存内容
until u 执行到指定行
其他命令
directory dir 插入目录
disable dis 禁用断点
down do 在当前调用的栈帧中选择要显示的栈帧
edit e 编辑文件或者函数
frame f 选择要显示的栈帧
forward-search fo 向前搜索
generate-core-file gcore 生成内核转存储
help h 显示帮助一览
info i 显示信息
list l 显示函数或行
nexti ni 执行下一行(以汇编代码为单位)
print-object po 显示目标信息
sharelibrary share 加载共享的符号
stepi si 执行下一行

启动gdb

1
ulimit -a

如果此时显示 core file size(core 文件大小)对应的值为 0,表示当前系统未开启 core dump 功能。

  • 此时开启core dump
    1
    ulimit -c unlimited
    此时,core file size显示unlimited则表示开启成功。
  • 以test.cpp为例,开启
    1
    gdb test.cpp

断点

  • 根据行号设置断点
    1
    2
    b 5
    b 文件名:行号
  • 根据函数设置断点
    1
    b main
  • 根据条件设置断点
    1
    b 文件名:行号 if 条件
  • 根据偏移量设置断点
    1
    b + 偏移量
  • 根据地址设置断点
    1
    b *地址
  • 设置临时断点
    1
    2
    临时断点只生效一次
    tbreak 文件名:行号
  • 显示所有的断点
    1
    info break
  • 删除断点
    1
    2
    3
    删除某个断点: delete 4
    删除全部断点: delete
    清除当前行断点 clear

运行

  • 运行
    1
    r 运行程序
  • 继续单步调试
    1
    n
  • 继续执行到下一个断点
    1
    c

查看源码和行号

1
l

打印

  • 打印变量和指针
    1
    p 变量名/指针名
  • 打印函数中的变量a
    1
    p 'main'::a
  • 打印指针指向的内容
    1
    p *指针名@长度
  • 设置变量
    1
    2
    set $index = 0
    p a[$index]
  • 设置打印的格式
    1
    2
    3
    4
    5
    6
    7
    8
    9
    x 按十六进制格式显示变量
    d 按十进制格式显示变量
    u 按十六进制格式显示无符号整型
    o 按八进制格式显示变量
    t 按二进制格式显示变量
    a 按十六进制格式显示变量
    c 按字符格式显示变量
    f 按浮点数格式显示变量
    p/格式 变量名

cmakelist配置

cmakelist.txt中加入

1
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGES} -o0 -g -ggdb")

同时,编译时:

1
2
3
4
5
6
cmake  -DCMAKE_BUILD_TYPE=Debug    Path    
make
```

### 多目录打断点时
设置dir查找目录

dir(断点文件路径)
b 断点文件 断点行号

1
2

### 推出gdb

q