目录
一、前言
debug和release
二、调试操作
2.1、退出 quit
2.2、调试 run
2.3、打断点 b
2.4、查看断点 info b
2.5、查看代码 l
2.6、删除断点 d
2.7、逐过程 n
2.8、打印变量内容 p
2.9、逐语句(进入函数) s
2.10、查看函数调用堆栈 bt
2.11、跑完函数 finish
2.12、常显示 dispaly
2.13、取消常显示 undisplay
2.14、跳转到指定行 until
2.15、跳转到下一个断点 c
2.16、disable和enable
三、总结
一、前言
gdb是Linux下的一种调试工具。我们可以使用命令:sudo yum install -y gdb来安装gdb。
注意:
1、程序的发布方式有两种,debug模式和release模式,而想进行调试只能在发布方式为debug版本下。
2、Linux 通过gcc/g++编译出来的二进制程序,默认是release模式,这也就意味着程序无法调试。
3、在Linux下要使用gdb调试,必须在源代码生成二进制程序的时候,加上 -g 选项。
debug和release
默认情况下,gdb无法进行对现在发布的程序进行调试(默认是release版本)。
首先我们先写一段下面需要使用的代码
#include<stdio.h> int addnum(int m){int sum=0; int i=0;for(i=0;i<m;i++){sum+=i;}return sum;}int main(){int m=10;int ret=addnum(m);printf("%d\n",ret);return 0;}
mytest:test.cgcc -o $@ $^ -std=c99
.PHONY:clean
clean:rm -f mytest mytest_g
然后我们在Makefile中先不加-g选项。这样是不能调试的:
我们给makefile加上-g选项生成debug可执行文件就可以调试;
PHONY:allall:mytest mytest_gmytest:test.cgcc -o $@ $^ -std=c99
mytest_g:test.cgcc -o $@ $^ -std=c99 -g
.PHONY:clean
clean:rm -f mytest mytest_g
二、调试操作
注意:gdb会记录最近的一条命令,如果命令无变化,可以直接回车。
对于下面的指令足以应付我们日常遇到的一些代码进行相关的调试,解决遇到的问题,同时对于gdb的基本使用我们也能够基本掌握
2.1、退出 quit
功能:退出gdb。
演示:
也可以使用q退出
2.2、调试 run
功能:使程序开始进行调试(也可以使用run)(调试运行,在断点处停下来)
演示:
也可以使用r进行调试
2.3、打断点 b
功能:在某一行打上一个断点
语法: b(break) 行数
演示:
2.4、查看断点 info b
功能:查看断点的各种信息。(查看当前设置了哪些断点)
演示:
2.5、查看代码 l
1、语法: l(list) 行号
list/l 行号:显示从第n行开始的源代码,每次显示10行,若n未给出则默认从上次的位置往下显示。
2、语法: l(list) 函数名
list/l 函数名:列出某个函数的源代码。
演示:
2.6、删除断点 d
功能:删除某一行的断点。
语法:d 断点编号(NUM)
演示:
2.7、逐过程 n
必须在run(r)过程中调试
功能:逐过程调试。使程序一步一步向下执行。相当于vs中的 f10。也可以用next。
演示:
2.8、打印变量内容 p
功能:打印变量的值。
语法:p/print 变量名。
演示:
2.9、逐语句(进入函数) s
功能:逐语句调试。相当于vs的f11。
演示:
2.10、查看函数调用堆栈 bt
功能:查看各级函数调用及参数。
演示:
2.11、跑完函数 finish
功能:执行完当前正在调用的函数后停下来(不能是主函数)。
2.12、常显示 dispaly
功能:将变量加入常显示(每次停下来都显示它的值)。类似于监视。
语法:display 变量名
2.13、取消常显示 undisplay
功能:取消指定编号变量的常显示。
语法:display 编号
演示:
2.14、跳转到指定行 until
功能:跳转到指定行
语法:until 行号。
演示:
2.15、跳转到下一个断点 c
功能:运行到下一个断点处。
演示:
2.16、disable和enable
disable 断点编号 :禁用指定编号的断点。
enable 断点编号 :启用指定编号的断点。
三、总结
至此,所有Linux下的基础工具都已经学完了。有了这些工具,我们可以在Linux下进行代码的编写,编译和调试。使我们在Linux下编写代码显得十分方便。