什么是GDB:
GDB - - - (GNU symbolic debugger)是Linux平台下最常用的一款程序调试器。
自己的Linux是否安装GDB?
一般来说,使用Ubuntu的话,系统就会自带的有GDB调试器的
命令窗口输入如下命令可以查看是否安装了gdb:
gdb -v
结果:
没有安装的话会出现如下:
[stu@localhost Desktop]$ gdb -v
bash: gdb: command not found
具体的安装过程,网上有很多的教程,这里不再赘述。
快速上手使用
示例1:正常代码调试分析
#include <stdio.h>
int main (){
unsigned long long int n, sum;
n = 1;
sum = 0;
while (n <= 100){
sum = sum + n;
n = n + 1;
}
return 0;
}
编译:
g++ -o main main10.c -g
-g 的作用:包含必要的调试信息,比如各行代码所在的行号、包含程序中所有变量名称的列表(又称为符号表)等,不加 -g 则没有,运行gdb时会报错
开始调试:
gdb main
输出如下:
发现会有很多的免责声明,可以通过 -q 选项进行屏蔽
gdb main -q
这下就清爽多了
GBD常用命令:
示例2:崩溃代码调试分析
#include "stdio.h"
int main(){
int *b = 0;
*b = 10;
printf("******** b = %d ************ ",*b);
}
g++ -o main main10.c -g
直接运行会有如下结果:
可以看到箭头3处打印出来的b值为空,因此出现了段错误,进而导致程崩溃。
基本GDB命令
为了定位问题,常常需要进行单步跟踪,设置断点之类的操作。
下边列出了GDB一些常用的操作。
启动程序:run
设置断点:b 行号|函数名
删除断点:delete 断点编号
禁用断点:disable 断点编号
启用断点:enable 断点编号
单步跟踪:next (简写 n)
单步跟踪:step (简写 s)
打印变量:print 变量名字 (简写p)
设置变量:set var=value
查看变量类型:ptype var
顺序执行到结束:cont
顺序执行到某一行: util lineno
打印堆栈信息:bt 或者 where