一、gdb简介
gdb简单的来说就是调BUG的,不管是在windows还是linux 都可以使用,供调试代码用的工具。
二、linux下gdb的安装
1.sudo apt-get update
2.sudo apt-get install gdb
三、gdb的使用
1.编写源文件如test.c;
2.使用gcc编译,注意需要加上-g参数;
gcc -o test.exe -g test.c;
3.调试程序;
gdb test.exe
四、gdb基本命令简介和使用
1.启动和退出gdb
(1)启动:gdb ***:显示一段版权说明; (*** 表示可执行程序名)
(2)退出:quit。有的时候输入quit后会出现相关提示:类似于“(y/n)”,输入y
2.显示和查找程序源代码
(1)list :显示10行代码,但是我为什么没有显示成功呢?
(2)list 5,10:显示源文件第五行到第十行的代码
(3)list t4.c:5,10:显示源文件中第五行到第十行的代码,在跳是含有多个源文件的次序时使用;
(4)list get_sum:显示get_sum函数周围的代码//什么叫周围的代码呢?
(5)list t4.c :get_sum:显示源文件t4.c中第五行到第十行的代码,在跳是含有多个源文件的次序时使用;
(6)如果在调试中运行linux命令,则可以在gdb的提示符下输入shell命令. (gdb)shell ls
(7)search forward用来从当前行向前查找第一个匹配的字符串;
search get_sum forward get_sum
(8)reverse_search 用来从当前行想前查找第一个匹配的字符串: Example: reverse_search main
3.执行程序和获得帮助;
gdb -q test 或者file test只是装入程序,程序并没有运行。如果要程序开始运行,在gdb提示符下输入run即可。
如果想要详细了解gdb某个命令的使用方法,可以用help 命令 Example:(gdb)help list (gdb)help all
4.设置和管理断点
(1)以行号设置断点:(gdb)break 7
(2)以函数名设置断点:(gdb)break get_sum
(3)以条件表达式设置断点:方法一:break 行号或者函数名 if 条件. Example: (gdb)break 7 if i==99
方法二:watch 条件表达式,下面是具体的举例:
方法三:awatch;用来给表达式设置断点,在表达式的值发生改变或者表达式的值杯读取的时候,程序暂时停止;
(4).查看当前设置的断点:info breakpoints
Num Type Disp Enb Address What
解释:Num列表示断点的编号,Type指明类型,类型位breakpoints说明是中断。Disp指示中断点在生效一次后是否就失去作用,如果是则为dis,不时则为keep。 Bnb表明当前中断点是否有效,如果是y,不是则为n。Address列表中断所处的内存地址。What列出中断发生在哪个函数的第几行。
5.使断点失效或者有效
使用“disable 断点编号”命令可以是某个断点失效,程序运行到该段点时不会停下来而是继续运行。
使用“enable 断点编号”命令可以是某个断点恢复有效。
6.删除断点
disable只是让某个断点暂时失效,断点依然存在与程序中。如果要彻底的删除某个断点,可以使用clear或者delete命令。
(1)clear:删除程序中所有的断点;
(2)clear 行号:删除此行中的断点
(3)clear 函数名:删除该函数的断点
(4)delete 断点编号:删除指定编号的断点。如果一次要删除多个断点,各个断点编号以空格隔开。
7.查看和设置变量的值
(1)print 变量或表达式 --- print 变量=值:对变量赋值 --- print 表达式@要打印的值的个数n:打印以表达式值开始n个数
(2)whatis命令:显示某个变量或表达式的数据类型。格式:whatis 变量或者表达式
(3)set 命令:给变量赋值,格式:set variable 变量=值
将上面实例中的print i=200改为set variable i=200可以得到同样的效果//这个不懂矮。。
除了这个用法外,set命令还有一些其他用法。比如可以针对远程调试进行设置,可以用来设置gdb一行的字符数等。
8.控制程序的执行
(1)continue命令:让程序继续运行,直到下一个断点或者运行完为止。格式:continue
(2)kill命令:用于结束当前程序的调试
(3)next和step命令
区别:如果遇到函数,next会把函数调用当作一条语句来执行,再次输入next会执行函数调用后的语句;
而step则会跟踪进入函数,一次一条的执行函数内的代码,直到函数内的代码执行完,在进行函数调用后的语句;
(4)nexti和stepi命令:用来单步执行一条机器指令,注意不是单步执行一条鱼据。单步执行一条语句使用next和step命令。通常一条语句有多条机器指令构成的。
注意的是:gdb的一些命令可以简写,比如list可以用li来代替,continue命令可以用cont来代替。
简单统计如下表
简写 | 全称 | 备注 |
l | list | 显示指定行号或者指定函数附近的源代码 |
b | break | 在指定行号或者指定的函数开头设置断点 |
r | run | 运行程序,直到程序遇到断点。如 b main |
c | continue | 在程序中断后继续执行程序,直达程序结束或者再次遇到断点。注意在程序开始执行前只能用r不能用c |
n | next | 执行下一条,跳过函数。 |
s | step | 执行下一条,跳入函数内部。 |
u | until | 执行代码到指定行号或者指定的函数开头 |
p | | 显示变量或者表达式的值 |
disp | display | 把一个表达式设置为display,当程序每次停下来都会显示其值 |
cl | clear | 取消断点,和b的格式相同 |
i | info | 显示各种信息。如i b 显示所有断点,i disp 显示display, 而i lo 显示所有局部变量 |
start | 开始执行程序,停在main函数第一行语句前面等待命令 | |
disable断点号 | 禁用此断点 | |
enable断点号 | 启用此断点 |
五、gdb 的高级功能
1.ignore(ig)命令可以让断点在count次到达是停下来。
2.condition(cond)给断点加个条件,如comd 2 i==5 让2号断点在i=5的时候有效
3.watch a (wa a )在变量a被被修改时停下来 ,同时显示当前a的值。同理awatch a (aw a)变量a在被读写时停下来,rwatch a (rw a) 则变量在被读时停下。