gdb调试工具基础

在windows平台下我们有IDE可以调试代码,而在Linux平台下调试的工作则交给了gdb工具,相对于windows平台的调试工具当然是比较繁琐,要使用各种命令去实现我们的调试,但作为一个开发平台,Linux平台下的调试我们是必须要掌握的,在此做一个小的总结。

一、测试代码

在linux平台下我们给出如下代码:
1.mymath头文件,进行函数声明:

//mymath.h头文件
#ifndef __NYMATH_H
#define __MYMATH_H

int my_add(int,int);
int my_sub(int,int);
int my_mux(int,int);
double my_div(int,int);

#endif

2.mymath.c文件,进行函数定义:

//mymath.c

#include<stdio.h>
#include<stdlib.h>

int my_add(int a,int b)
{
    
    
	return a+b;
}

int my_sub(int a,int b)
{
    
    
	return a-b;
}

int my_mux(int a,int b)
{
    
    
	return a*b;
}

double my_div(int a,int b)
{
    
    
	if(0==b)
	{
    
    
		printf("error\n");
		exit(0);
	}
	return (a*0.1)/b;
}

3.主函数文件:

//main.c
#include<stdio.h>
#include<stdlib.h>
#include"mymath.h"

int main()
{
    
    
	int a=20;
	int b=3;

	printf("a+b=%d\n",my_add(a,b);
	printf("a-b=%d\n",my_sub(a,b);
	printf("a*b=%d\n",my_mux(a,b);
	printf("a/b=%f\n",my_div(a,b);

	return 0;
}

二、生成debug版本的命令

首先我们需要知道debug版本和release版本的区别:

realese版本:

release版本被称为发行版本,用于交付给用户使用,我们使用的APP都是realese版本;

debug版本:

debug版本被称为开发版本或可调试版本,一般用于开发人员调试,他与release版本的区别就是他在编译阶段增加了一些debug段,生成的文件是可以逐步执行的;

生成debug版本的命令

linux平台下默认生成的都是release版本,生成debug版本的命令如下:
gcc -o main main.c -g
此时生成的main文件就是可调试版本的。在分步编译时需要在编译或者汇编阶段加入-g选项生成debug版本文件;

三、调试过程

1.生成可调试文件并进入gdb调试:
在这里插入图片描述
进入gdb调试的命令即为:gdb 可调试文件名 ,界面如图则进入调试模式;
2.l命令:
显示main函数所在文件的源代码,一次显示不完的话可以按回车全部显示(截取部分):
在这里插入图片描述
3.list 文件名:行号命令
显示指定文件中从指定行号开始的内容

在这里插入图片描述
4.断点管理:
(1)b 行号:给指定行添加断点(默认给最近显示的文件添加断点):
在这里插入图片描述

(2)b 函数名:给指定函数的第一行有效代码添加断点:
在这里插入图片描述
(3)info b:显示所有断点信息
在这里插入图片描述
(4)disable/enable 断点号:将指定断点设置为无效/有效:
在这里插入图片描述
通过查看断点信息可以看到其状态会有变化。
(5)delete/d 断点号:删除断点
在这里插入图片描述
可以查看到1号断点已经被删除
(6)run/r:开始执行到运行过程中的第一个断点处(在此之前先给main函数的开始添加一个断点)
在这里插入图片描述
因为添加断点在第五行而且第五行并没有内容,所以直接运行到了第七行;
(7)next/n:开始逐过程单步执行:
在这里插入图片描述
(8)print/p val:查看val的值
在这里插入图片描述
p显示其他的量(调用函数以及做某些操作)
在这里插入图片描述
当使用指针对一个数组进行查看时格式如下:

扫描二维码关注公众号,回复: 13293686 查看本文章

p *ptr@len

当使用p指令查看结构体时,会将结构体内部的变量值都显示出来;
(9)s:逐语句执行,例如在运行到某个函数中时:
在这里插入图片描述
可以看到执行的步骤是不一样的。
(10)bt:显示函数调用栈
在这里插入图片描述

(11)finish:跳出函数;
(12)continue/c:继续执行,直接执行到下一个断点处;
(13)display val:每步的执行中都自动显示某个量的值;
(14)undisplay display编号:删除自动显示;
(15)info display:查看自动显示的信息;
(16)ptype name:查看name所代表的类型
(17)quit/q:退出调试;

更多的指令可以使用gdb -help命令查看,这是一个非常有用的调试利器,所以还是得多练练,熟悉一点会对我们在linux平台上调试代码有很大的益处。

猜你喜欢

转载自blog.csdn.net/qq_45132647/article/details/105850878