linux——初级gdb调试(保姆级教程)

文章目录

  • 一、为什么要gdb调试
  • 二、编译前的准备
  • 三、gdb命令以及基本操作
    • 3.1 退出
    • 3.2 设置断点
    • 3.3 运行和继续
    • 3.4 继续运行下一句
    • 3.5 显示变量
    • 3.6 step函数
    • 3.7 set var函数
  • 四、总结

一、为什么要gdb调试

在liunx系统操作过后,大家都知道一个问题,就是段错误。编译没问题,但是就是跑不起来。按照原始的方式,你可以一行一行的添加printf去打印调试信息。但是这样就减少了代码的可读性,所以我们需要gdb调试。

二、编译前的准备

在编译之前需要安装gdb调试环境,我的linux系统没安装过他自己也有,应该是系统自带的吧,但是centos系统好像需要,如何检查是否安装了gdb

linux——初级gdb调试(保姆级教程)_第1张图片输入gdb,如果在命令行出现了下面这段代码,那就是没问题的了。

三、gdb命令以及基本操作

linux——初级gdb调试(保姆级教程)_第2张图片用gcc编译源程序的时候,编译后的可执行文件不会包含源程序代码,如果您打算编译后的程序可以被调试,编译的时候要加-g的参数

gcc -o  test test.c -g
gdb test

3.1 退出

输入q 回车就退出了(我第一次没教程直接ctrl + d)。
linux——初级gdb调试(保姆级教程)_第3张图片

3.2 设置断点

b设置断点,就是程序运行到该行就会停下来,可以设置多个断点。
简单的写一个test

#include 
void print()
{
        for(int i = 2; i< 5; i++)
        {
                printf("hello world!\n");
        }
}
int main()
{
        print();
        return 0;
}

linux——初级gdb调试(保姆级教程)_第4张图片这样我就在第四行和第八行设置了两个断点

3.3 运行和继续

r 运行,一个r就是从程序开始到第一个断点。
但是程序继续运行就不是按r而是按 c 了,为什么,因为按 r 会提示你,你确认了也没用
linux——初级gdb调试(保姆级教程)_第5张图片按下C我们就能从上一个断点到下一个断点
linux——初级gdb调试(保姆级教程)_第6张图片

3.4 继续运行下一句

n 执行程序的下一句
请注意,如果程序在一个循环之中,那么他会把循环一直循环结束后跳出。
linux——初级gdb调试(保姆级教程)_第7张图片

3.5 显示变量

p显示变量。
为了方便展示,所以这里重新写一个代码;

#include 
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;
}

linux——初级gdb调试(保姆级教程)_第8张图片比如这里,我给name赋值了一个xishi的字符串,但是,在gdb调试的时候是显示不出来的,所以我这里用P name 来显示name的赋值。
请注意,我这里设置了几个断点,但是在跳过断点过后,我就没办法用p 来显示之前断点的值,如果没有跳过则可以,所以在显示的时候记得在特定的断点使用。

linux——初级gdb调试(保姆级教程)_第9张图片

3.6 step函数

简单来说就是自己写的函数可以通过设定断点,然后用s跳进这个函数里面的第一句,在使用n一行一行的去执行这个函数的源码。这个函数必须在文件里面有源码,如果是自带的则不能使用

linux——初级gdb调试(保姆级教程)_第10张图片

3.7 set var函数

就相当于给函数重新赋值。

linux——初级gdb调试(保姆级教程)_第11张图片
这里可以看出 set var 可以给变量赋值。但是在原本程序打印之前赋值会被原本的程序修改回来,但是在原本程序后修改则不会。

四、总结

这里就说这些吧,后面还有一些进程调试,在程序运行中调试,可以去看看视频。
编程就是不断的重复使用的过程,熟能生巧这句话适用于很多地方。

你可能感兴趣的:(linux,gcc/gdb编译调试)