文章

Linux GDB调试器

gdb调试器。

Linux GDB调试器

GDB

Linux 中的 GDB (GNU Debugger)GNU 项目开发的、功能强大的源代码级命令行调试器。它是 Linux 和类 Unix 系统上 C, C++, Fortran, Go 等编译型语言程序调试的标准工具

简单来说,GDB 就像程序的“手术显微镜”🧬,让你能在程序运行时深入其内部,观察和控制其执行过程,帮助你找出代码中的错误(Bug)。

安装 gdb

1
sudo apt install gdb

编译源文件

使用 -g 选项,添加调试信息,更容易地调试程序

1
2
gcc -g -o hello hello.cpp
g++ -g -o hello hello.cpp

加载文件

使用 gdb 调试程序,首先加载必要的文件,如 可执行程序、core文件。

以可执行文件hello为例。

方法1,启动 GDB 时直接加载(推荐)

1
2
3
4
5
# 只有可执行程序
gdb hello

# core文件
gdb hello core.11232

方法2,在 GDB 交互模式中手动加载

1
2
3
4
5
6
7
8
# 只有可执行程序
gdb
file hello

# core文件
gdb
file hello
core core.11232  # core 全写为 core-file

断点

break 命令,可简写为 b,用于添加断点。

1
2
3
break 源文件行号
break 源文件函数名
b     源文件函数名

查看断点

1
2
3
(gdb) info breakpoints
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000000011b1 <main+8>

Num为断点编号

deleted,用于删除断点。

1
2
delete 断点编号
d breakpoints  # 删除所有断点

断点有效性

1
2
3
4
5
disable b(breakpoints)          # 使所有断点无效【默认缺省】
enable  b(breakpoints)          # 使所有断点有效【默认缺省】

disable b(breakpoints) + 编号   # 使一个断点无效【禁用断点】
enable  b(breakpoints) + 编号   # 使一个断点有效【开启断点】

这里breakpoints可以简写为 b,且可以省略

运行程序

run,简写为 r

1
2
r
run

单步执行

next,简写为 n

步入

step,简写为 s,用于进入函数体。

继续执行

continue,简写为 c

调用栈

backtracebt,显示函数调用栈(含参数)。

打印

printp,打印变量值。

1
p var

set

set 设置变量值,修改运行中的变量值。

1
set var 变量名=value

finish

finish 在一个函数内部,执行到当前函数返回,然后停下来等待命令

退出gdb调试

1
2
3
q
quit
exit

列出源代码

listl

1
2
3
4
5
6
7
8
9
10
11
12
13
# 显示当前行附近的源代码
l
list

# 从第一行开始往下列10行的内容
l 0
l 1

# 显示文件 filename.c 的第10行附近的代码
l filename.cpp:10

# 列出指定函数的完整源码,函数需在当前加载的符号表中
l 函数名

display 和 undisplay

display 用于 跟踪查看一个变量,每次停下来都显示它的值【变量/结构体…】。

1
display num1

undisplay 用于 取消对先前设置的那些变量的跟踪。

1
undisplay 变量编号

until

until 运行到指定行。

1
until 行号

目标行需在当前函数内,即行号是从该函数开始编号的。

本文由作者按照 CC BY 4.0 进行授权