文章目录
一、为什么要gdb调试
在liunx系统操作过后,大家都知道一个问题,就是段错误。编译没问题,但是就是跑不起来。按照原始的方式,你可以一行一行的添加printf去打印调试信息。但是这样就减少了代码的可读性,所以我们需要gdb调试。
二、编译前的准备
在编译之前需要安装gdb调试环境,我的linux系统没安装过他自己也有,应该是系统自带的吧,但是centos系统好像需要,如何检查是否安装了gdb
输入gdb,如果在命令行出现了下面这段代码,那就是没问题的了。
三、gdb命令以及基本操作
用gcc编译源程序的时候,编译后的可执行文件不会包含源程序代码,如果您打算编译后的程序可以被调试,编译的时候要加-g的参数
gcc -o test test.c -g
gdb test
3.1 退出
输入q 回车就退出了(我第一次没教程直接ctrl + d)。
3.2 设置断点
b设置断点,就是程序运行到该行就会停下来,可以设置多个断点。
简单的写一个test
#include <stdio.h>
void print()
{
for(int i = 2; i< 5; i++)
{
printf("hello world!\n");
}
}
int main()
{
print();
return 0;
}
这样我就在第四行和第八行设置了两个断点
3.3 运行和继续
r 运行,一个r就是从程序开始到第一个断点。
但是程序继续运行就不是按r而是按 c 了,为什么,因为按 r 会提示你,你确认了也没用
按下C我们就能从上一个断点到下一个断点
3.4 继续运行下一句
n 执行程序的下一句
请注意,如果程序在一个循环之中,那么他会把循环一直循环结束后跳出。
3.5 显示变量
p显示变量。
为了方便展示,所以这里重新写一个代码;
#include <stdio.h>
int a()
{
int i = 1, j = 5, k;
printf("k = %d\n",i * j);
return 0;
}
int b()
{
int m = 5, n = 6, s;
printf("n = %d\n", m * n);
return 0;
}
int main()
{
a();
b();
char name[] = {"xishi"};
printf("%s",name);
return 0;
}
比如这里,我给name赋值了一个xishi的字符串,但是,在gdb调试的时候是显示不出来的,所以我这里用P name 来显示name的赋值。
请注意,我这里设置了几个断点,但是在跳过断点过后,我就没办法用p 来显示之前断点的值,如果没有跳过则可以,所以在显示的时候记得在特定的断点使用。
3.6 step函数
简单来说就是自己写的函数可以通过设定断点,然后用s跳进这个函数里面的第一句,在使用n一行一行的去执行这个函数的源码。这个函数必须在文件里面有源码,如果是自带的则不能使用
3.7 set var函数
就相当于给函数重新赋值。
这里可以看出 set var 可以给变量赋值。但是在原本程序打印之前赋值会被原本的程序修改回来,但是在原本程序后修改则不会。
四、总结
这里就说这些吧,后面还有一些进程调试,在程序运行中调试,可以去看看视频。
编程就是不断的重复使用的过程,熟能生巧这句话适用于很多地方。