在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显示其他的量(调用函数以及做某些操作)
当使用指针对一个数组进行查看时格式如下:
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平台上调试代码有很大的益处。