linux-func-gdb

介绍

gdb命令包含在GNU的gcc开发套件中,是功能强大的程序调试器。GDB中的命令固然很多,但我们只需掌握其中十个左右的命令,就大致可以完成日常的基本的程序调试工作。
使用gdb的前提是程序在编译的时候开启的 -g选项。

安装

1
yum install gdb

用法

1
gdb(语法)(参数)

选项

选项 描述
-cd 设置工作目录;
-q 安静模式,不打印介绍信息和版本信息;
-d 添加文件查找路径;
-x 从指定文件中执行GDB指令;
-s 设置读取的符号表文件。

命令

设置输入参数

1
2
3
4
set args 参数值1 参数值2 ...

# 输入参数 1 2
set args 1 2

显示输入参数

1
show args

打印代码内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 缩写:l
# 每次按下Enter键后顺序向下列出代码

list 开始,结束
list 函数
list 文件:函数

# 从第1行开始打印当前代码
list 1

# 打印当前代码的4-5行
list 4,5

# 打印当前代码的FuncA函数
list FuncA

# 打印AA.cpp文件的FuncB函数
list AA.cpp:FuncB

设置断点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 缩写:b

break 行号 # 程序停止在设定的行之前
break 函数名称 # 程序停止在设定函数之前
break 脚本名:行号 # 程序停止在指定脚本的某一行
break 行号或函数if条件 # 这是一个条件断点设置命令,如果条件为真,则程序在到达指定行或函数时停止

# 在当前代码的第4行断点
b 4

# 在当前代码的funcA函数断点
b funcA

# 在test.cpp的第4行断点
b test.cpp:4

# 在当前代码的4行断点,且要求变量i的值等于2
b 45 if i==2

删除断点

1
2
3
4
delete b 行号

# 删除当前代码的第8行的断点
delete b 8

禁止断点

1
2
3
4
disable b 行号

# 禁用当前代码的第8行的断点
disable b 8

启用断点

1
2
3
4
enable b 行号

# 启用被禁用的第9行的断点
enbale b 9

清除断点

1
2
3
4
5
clear # 清楚所有断点
clear 行号

# 清除底2行的断点
clear 2

打印变量内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 缩写:p

print 变量或表达式等

# 打印2+3的值
p 2+3

# 打印sum(3)的值
p sum(3)

# 打印playername变量的值
p playername

# 打印数组arr的值
p arr

# 打印数组arr[1]的值
p arr[1]

# 打印下标数组arr[1]的地址
p &arr[1]

# 查看数组arr len长度的动态内存
p *arr@len

变量跟踪

跟踪查看某个变量,每次断点停下来都显示它的

1
2
3
4
display 变量名

# 打印playerName变量的值
display playerName

取消变量跟踪

跟踪编号可以通过info displaydisplay来显示

1
2
3
4
undisplay 跟踪编号

# 取消编号为3的变量跟踪
undisplay 3

修改变量的值

1
2
3
4
set 变量=value

#设置变量number的值为5
set number=5

值变动监听

监听是断点判断的另一种形式,监听的变量的行需要有断点才生效

1
2
3
4
watch expr

# 监听index变量的变动
watch index

变量类型检测

1
2
3
4
5
6
7
whatis 变量名

# 打印变量name的类型
whatis name

# 打印变量*io的类型
whatis *io

变量类型检测

1
ptype 变量名

跳出循环

1
until

调到下一断点

1
2
3
# 缩写:c

continue

列出信息

1
2
3
4
5
6
7
8
# 缩写:i

info
info break # 显示当前GDB的断点信息
info thread # 显示当前线程的信息
info frame或info f # 显示调用栈信息
info args # 打印当前函数的参数名及变量
info locals # 打印当前函数中所有局部变量及值

下一行

1
2
3
# 缩写:n

next

进入函数

1
2
3
# 缩写:s

step

退出函数

1
finish

加载文件

1
file 文件路径

运行程序

1
2
3
4
5
6
7
8
9
# 缩写:r

run [参数]

# 无参数运行程序
run

# 输入参数3运行程序
run 3

调用栈

1
2
3
# 缩写:bt

backtrace

查看调用栈某一层

1
2
3
4
5
6
# 缩写:frame 或 f

select-frame 编号

# 显示调用栈编号2的信息
f 2

调用栈向上移动层数

1
2
3
4
5
6
# 缩写:up

up-silently 层数

# 查看往上2层调用栈的信息
up 2

调用栈向下移动层数

1
2
3
4
5
6
# 缩写:down

down-silently 层数

# 查看往下1层调用栈的信息
down 1

进入线程

1
thread 线程id

汇编查看

1
2
3
4
disassemble 方法

# 查看funcA方法的汇编代码
disassemble funcA

退出GDB

1
q

GDB帮助信息

1
2
3
4
help

# 查看break命令的信息
help break

参数

参数 描述
文件 二进制可执行程序。

例子

1
2
# 调试test程序
gdb test