当前位置:首页 > 公众号精选 > 嵌入式大杂烩
[导读]GDB(GNU Debugger)是一个强大的命令行调试工具。一般的,在Windows下进行开发,很少操控命令行调试,调试器大多与编译器都集成在IDE里了。当然,在Windows下也可以直接使用gcc、gdb来做编译调试我们的C程序。

GDB简介

GDB(GNU Debugger)是一个强大的命令行调试工具。一般的,在Windows下进行开发,很少操控命令行调试,调试器大多与编译器都集成在IDE里了。

当然,在Windows下也可以直接使用gcc、gdb来做编译调试我们的C程序,如MinGW( 一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合 )中就同时包含有gcc与gdb工具:


使用gdb -v命令可查看gdb的版本:


但是,在Linux下进行开发,gdb工具是必知必会的工具之一。

小编最近也转战Linux了,自然也要掌握一些必知必会的基础工具及知识。小编也是用到哪学到哪,本篇笔记我们先来分享gdb的使用:

实例演示GDB的使用

老读者们都知道,本公众号文章的特点之一就是实例比较多、可操作性比较强,跟着文章一步一步做应该可以学到一些东西。

同样的,本篇笔记我们也以实例来做分析。

示例代码gdb_test.c:

左右滑动查看全部代码>>>

// 公众号:嵌入式大杂烩
// 作者:ZhengN
#include 

// 测试函数1
void test0(void)
{
 int i = -1;

 if (i = 0)
  printf("i = %d\n", i);
 else if (i = 1)
  printf("i = %d\n", i);
 else
  printf("i = %d\n", i);
}

// 测试函数2
void test1(void)
{
 int a[10] = {0,1,2,3,4,5,6,7,8,9};
 int *p = &a[1];
 int *p1 = (int*)(&a + 1);

 printf("p[6] = %d\n", p[6]);  
 printf("*(p1 - 1) = %d\n", *(p1 - 1));  
}

// 主函数
int main(int argc, char *argv[])
{
    test0();
    test1();
    
    return 0;
}

这个示例代码中有两个测试函数,其实也是两道经典易错的面试笔试题。大家可以先思考一下结果是什么。

下面我们使用gdb来一步一步调试及分析,在Windows下做实验,Linux下的操作类似。

一般的,我们使用如下命令来编译:

gcc gdb_test.c -o gdb_test.exe

这样编译出来的gdb_test.exe是不带调试信息的。我们必须编译出带有调试信息(如行号等信息)的可执行文件才能使用gdb进行调试。在以上基础上加个-g参数即可生成调试信息。

除此之外,我们编译时应不使用优化选项,若使用优化,则编译器会对程序进行一些优化,有可能会更改语句的顺序及优化一些变量,从而可能会导致程序执行流程与源码流程不匹配的情况。

进一步,可以使用-Wall参数打开所有警告,所以我们的编译命令变为:

gcc -g -Wall gdb_test.c -o gdb_test.exe

1、GDB常用命令

下面粗略地列出一些常用的命令:

2、demo调试分析

使用上面的编译命令编译得到带调试信息的可执行程序gdb_test.exe,有两种方法启动调试。

一种方法是先输入gdb命令进入gdb环境,再输入file+可执行程序装入调试文件,即:


另一种方法是直接输入gdb+可执行程序对该程序进行调试,即:

(1)调试测试函数1

上面的测试函数1大家思考得出结果了吗?我们单步调试看看结果是怎么样的:

① 在test1函数入口打个断点:

② 运行到断点处:

③ 单步往下执行:


显然,单步运行到了这一句我们就得出了测试函数1的结果,即输出 i = 1。大家分析得对了吗?

这要是不注意还真的容易出错,这里的if判断条件里用的是=号,而不是==号,这个小陷阱可能会迷惑一些初学C语言的朋友。

if语句的通用形式为:

if (expression)
 statement

可以明确的是:如果对expression为真(非0),则执行statement。本题中,如if (i = 0)其实就等价于

i = 0;
if (i)

显然这里的if语句的expression为假,不会执行statement。

类似的if (i = 1)等价于

i = 1;
if (i)

显然这里的if语句的expression为真,执行statement。

平时在发现自己写的代码执行的流程异常时,不妨debug调试一下,一步一步地走,看程序是否按照自己设计的流程走,看是不是我们的执行逻辑设计错了。

(2)调试测试函数2

测试函数2也是一道极其经典的面试题目。不能一眼看出结果?没关系,我们一起调试分析一下。接着上面的流程,我们输出quit命令推出gdb环境,再重新进入调试test2。

① 在test2函数入口打个断点:

② 运行到断点处:


此时,我们不妨看一下a[1]元素的地址a数组里面的内容是什么:


可见,在数组初始化之前,整个数组空间里的值是一些随机值。这里反映一个问题,局部变量在初始化之前的值是无规律的,所以不妨在定义局部变量的时候初始化一个确定的值,防止出错。

③ 单步往下执行:

此时,我们来看一下,指针变量p的值、a数组里的值:

因为此时第23行这条语句还未执行,所以p指向的地址还不是a[1]元素的地址。

再单步往下执行,然后我们看一下,指针变量p的值,及以指针变量p的值为首地址、往后偏移10个内存单元为结束地址,这一段空间内的值是什么:


至此,我们通过调试清晰地得到了p[6]的值。

继续单步往下执行,我们看一下,&a[0]的值、&a的值、(&a+1)的值、p1的值:


从gdb输出的信息我们知道&a的类型是(int (*) [10] ),即是一个指向含有10个元素的整形数组的指针,所以(&a+1)的意义是往后偏移10 * sizeof(int)。进一步,再利用一下其它输出的信息:

&a的值为0x61fee0
&a+1的值为0x61ff08


两个值相减得到40,正好是整个数组所占的字节数。

而p1是一个整形指针,所以p1-1指向的就是往前偏移sizeof(int)个字节的地址,即a[9]的地址(0x61ff04),所以*(p1 - 1)的值也就是a[9]的值。最后我们再看一下&a往后的40个地址里的值都是些什么:


以上就是本次的实例演示,只是用到了一小部分gdb的命令,还有更多命令大家可以自己练习使用,基本的会了,不懂的地方遇到的时候再查也来得及。

可能写得有些乱,但也希望能对大家有帮助。总之,对于一些不确定的知识点或者程序的执行与预期不相符时,不妨调试一下,一步一步看数据有没有异常。

猜你喜欢

面试官:Linux下如何编译C程序?

干货 | 嵌入式必备技能之Git的使用

例说嵌入式实用知识之JSON数据

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭