1、背景

  • 程序的发布方式有两种,debug模式和release模式
  • Linux gcc/g++编译出来的二进制程序,默认是release模式
  • 要使用gdb调试,必须在源代码生成二进制程序的时候,加上-g选项

例如gcc test.c -o mybin -g

2、命令功能

gdb binFile(开始使用),ctrl+d或quit(退出)

测试代码:

gdb的使用_GDB

调试命令:

GDB中可以直接回车键重复上一次的命令,用pgUp键可以查看历史命令。

(1)list/l 行号 

功能:功能显示binFile源代码,每次显示周围10行。

l指令默认从main函数开始显示:

gdb的使用_指令_02

l 1 显示第一行周围的代码,再用l或者直接回车键键,可以继续查看下面10行代码:

gdb的使用_指令_03

(2)list/l 函数名

功能:显示出某个函数的源代码。

l mian ,显示出main函数的周围10行的源代码:

gdb的使用_GDB_04

l mul:

gdb的使用_指令_05

(3)break/b 行号

功能:在某一行设置断点。

在25行打上断点:

gdb的使用_Linux下代码调试_06

(4)break/b 函数名

功能:在某个函数开头设置断点。

在Add函数开头设置断点:

gdb的使用_指令_07

也可以用b 函数名:行数,在函数的第任意行打断点,在main函数的第3行打断点:

gdb的使用_指令_08

在多文件时,也可以b 文件名:函数名:行数打断点,在test.c文件里的Add函数里的第二行打断点:

gdb的使用_指令_09

(5)info break/i b

功能:查看断点的信息。

会把打的断点的信息显示出来,Num是断点编号,Type是断点的类型,Disp是断点配置,Enb是是否启用断点,Address是断点的地址,What是断点在代码中的位置:

gdb的使用_GDB_10

(6)delete breakpoint/d 断点编号

功能:删除断点编号所代表的断点

删除4号和5号断点:

gdb的使用_指令_11

如果不加编号,就会删除所有断点:

(7)disable 断点编号

功能:禁用断点。

禁用断点后改断点就不能在使用,Enb也会变成n:

gdb的使用_Linux下代码调试_12

(8)enable 断点编号

功能:启用断点

让断点重新能够使用,Enb变成y:

gdb的使用_GDB_13

(9)run/r

功能:开始调试。

如果没有断点,就会直接运行完程序,打印出运行结果:

gdb的使用_Linux下代码调试_14

如果有断点,就会在断点出停下,并打印改行代码:

gdb的使用_GDB_15

如果断点被命中,断点信息会多一条breakpoint already hit 1 time:

gdb的使用_GDB_16

(10)continue/c

功能:从当前位置开始连续执行程序。

当我们run开始调试后,遇到断点停止了,此时想要继续往下执行,可以选择continue,他会连续执行程序,如果遇到断点就会停下来,否则直接运行到程序结束:

gdb的使用_指令_17

(11)next/n

功能:主逐过程执行。

不会进入调用的函数,遇到空行会跳过:

gdb的使用_Linux下代码调试_18

(12)step/s

功能:逐语句执行。

会进入调用的函数:

gdb的使用_Linux下代码调试_19

(13)p 变量/表达式

功能:打印变量值或者表达式的值。

gdb的使用_指令_20

(14)display 变量名

功能:跟踪查看一个变量,每次停下都显示它的值。

跟踪变量旁边的数字是它们的编号:

gdb的使用_GDB_21

(15)undisplay 编号

功能:取消对先前设置的那些变量的跟踪。

gdb的使用_指令_22

(16)until 行号

功能:运行至指定的行

可以用这个命令来跳过不想看的代码:

gdb的使用_GDB_23

(17)finish

功能:运行到当前函数结束,然后停下来等待命令。

在第22行断点处停下后,用s指令进入Add函数,在函数内执行finish指令,运行到当前函数结束后,在第22行停止等待命令:

gdb的使用_Linux下代码调试_24

(18)bt

功能:查看调用堆栈。

在main函数里查看调用堆栈就只有main函数,在Add函数里查看调用堆栈,Add就被压到了栈顶:

gdb的使用_指令_25

(19)set var

功能:修改变量的值。

gdb的使用_指令_26

这个指令可以用来控制循环语句里的循环变量,来快速到达自己想要看的循环次数。


完结。。。

如有错误,欢迎指正,谢谢。