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

一、为什么要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 可以给变量赋值。但是在原本程序打印之前赋值会被原本的程序修改回来,但是在原本程序后修改则不会。

四、总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永不秃头的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值