安装gdb
-
centos
sudo yum update sudo yum install gdb
-
ubuntu
sudo apt update sudo apt install gdb
编译准备
正常编译,不带有gdb调试信息
g++ test.cpp -o test
加入gdb调试信息
g++ -g test.cpp -o test
使用gdb
1. 启动gdb
gdb 可执行程序
gdb test
2. 命令行调试
1. 启动&退出
命令 | 解释 |
---|---|
run | 缩写 r ,如果程序中设置断点,会停在第一个断点处,如没有断点,程序执行完 |
start | 启动程序 , 阻塞在 main 函数第一行 ,等待输入的后续其他gdb命令 |
continue | 缩写 c ,在使用start命令后,或在断点处继续运行 , 可以使用 continue 命令/或直接回车 |
quit | 缩写 q , 退出gdb调试,终止gdb线程 |
在gdb中启动需要调试的应用程序有两种方式 :
run 命令 、 start 命令
二者选其一
2. 断点操作
在程序的某一行设置断点,程序运行到此会阻塞。
设置断点
设置断点的命令break
,缩写 b
-
设置普通断点
命令 | 解释 |
---|---|
b rowNum | 在程序的第几行设置断点 |
b rowNum1 rowNum2 | 在程序的第num1...num2行设置断点 |
b functionName | 在当前函数设置断点 |
-
设置条件断点
# 必须要满足某个条件, 程序才会停在这个断点的位置上 # 通常情况下, 在循环中条件断点用的比较多 (gdb) b 行数 if 变量名==某个值
查看断点
断点设置完成之后,可通过 info break
命令查看设置的断点信息 ,可以缩写为 i b
断点信息中重点属性
-
Num:
断点的编号,删除断点或者设置断点状态的时候都需要使用(重要) -
Enb:
当前断点的状态,y 表示断点可用,n 表示断点不可用 -
What:
描述断点被设置在了哪个文件的哪一行或者哪个函数上
删除断点
通过 delete 断点编号
,其中 delete
可以简写为 del
/ d
命令 | 解释 |
---|---|
d 断点编号1 断点编号2 .... | 删除(一个或多个)指定断点 |
d num1 - num5 | 删除一个连续的断点区间 |
设置断点状态
相比删除断点,设置断点状态更加灵活。
设置断点状态之前,可以通过
i b
来进行查看断点状态。
-
disable 断点编号
:缩写dis
,将断点状态设置为不可用状态。 -
enable 断点编号
:缩写ena
,将断点状态设置为可用状态。
这两个命令也跟上面delete命令用法一样,可以设置(一个或多个)指定断点 或者 设置一个连续的断点区间
3. 查看代码
4. 打印变量信息
程序阻塞后,可以通过 print 命令
,缩写 p
打印变量的名字或变量类型 ,并且跟踪打印某变量的值。
p 变量名
如果打印变量为整数类型,可指定输出整数格式。
格式化字符 | 说明 |
---|---|
/x | 以十六进制的形式打印出整数。 |
/d | 以有符号、十进制的形式打印出整数 |
/u | 以无符号、十进制的形式打印出整数。 |
/o | 以八进制的形式打印出整数。 |
/t | 以二进制的形式打印出整数。 |
/f | 以浮点数的形式打印变量或表达式的值。 |
/c | 以字符形式打印变量或表达式的值。 |
# 如果变量为整型,默认以十进制输出 p/t 变量名
打印变量类型
ptype 变量名 #举例 (gdb) ptype i type = int (gdb) ptype array[i] type = int (gdb) ptype array type = int [12]
display
当我们想频繁查看某个变量或表达式的值从而观察它的变化情况时,使用 display 命令。
#在变量的范围内 , 自动打印变量的值 (设置一次后自动打印) (gdb) display 变量名 #以指定的输出格式打印变量的值 (gdb) display/f 变量名
-
查看display自动显示的变量列表信息
info display
# 打印 自定显示的变量信息 (gdb) info display Auto-display expressions now in effect: Num Enb Expression 1: y i 2: y array[i] 3: y /d array[i]
参数 | 含义 |
---|---|
Num | 变量或表达式的编号,GDB 调试器为每个变量或表达式都分配有唯一的编号 |
Enb | 表示当前变量(表达式)是处于激活状态还是禁用状态,如果处于激活状态(用 y 表示),则每次程序停止执行,该变量的值都会被打印出来;反之,如果处于禁用状态(用 n 表示),则该变量(表达式)的值不会被打印。 |
Expression | 被自动打印值的变量或表达式的名字。 |
-
取消自动显示
取消自动显示可以有两种方式:删除这个自动显示变量以及设置禁止状态
删除自动显示变量
undisplay 编号
ordelete display 编号
undisplay num [num1 ...] delete display num [num1 ...]
设置禁止状态
disable
orenable
disable display num [num1 ...] enable display num [num1 ...]
这些命令后面可以是一个或者多个编号,也可以是num1-num2表示一个范围