【Linux基础】用Gdb调试有问题的程序_u010926630的专栏-程序员宅基地

技术标签: Linux版本  Linux目录  C语言  Linux、 C语言l  Linux基础  嵌入式  

1. 实验目的
通过调试一个有问题的程序,使读者进一步熟练使用Vi 操作,而且熟练掌握Gcc 编译命令及Gdb 的调试命令,通过对有问题程序的跟踪调试,进一步提高发现问题和解决问题的能力。这是一个很小的程序,只有35 行,希望读者能够认真调试。
2. 实验内容
(1)使用Vi 编辑器,将以下代码输入到名为greet.c 的文件中。此代码的原意为输出倒序main函数中定义的字符串,但其结果显示没有输出。代码如下所示:
#include <stdio.h>
int display1(char *string);
int display2(char *string);
int main ()
{
char string[] = "Embedded Linux";
display1 (string);
display2 (string);
}
int display1 (char *string)
{
printf ("The original string is %s \n", string);
}
int display2 (char *string1)
{
char *string2;
int size,i;
size = strlen (string1);
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size - i] = string1;
string2[size+1] = ' ';
printf("The string afterward is %s\n",string2);
}
(2)使用Gcc编译这段代码,注意要加上“-g”选项方便之后的调试。
(3)运行生成的可执行文件,观察其运行结果。
(4)使用Gdb调试程序,通过设置断点、单步跟踪,一步步找出错误所在。
(5)纠正错误,更改源程序并得到正确的结果。
3. 实验步骤
(1)在工作目录上新建文件greet.c,并用Vi 启动:vi greet.c。
(2)在Vi 中输入以上代码。
(3)在Vi 中保存并退出:wq。
(4)用Gcc进行编译:gcc -g greet.c -o greet。
(5)运行greet:./greet,输出为:
The original string is Embedded Linux
The string afterward is
可见,该程序没有能够倒序输出。
(6)启动Gdb调试:gdb greet。
(7)查看源代码,使用命令“l”。
(8)在30 行(for 循环处)设置断点,使用命令“b 30”。
(9)在33 行(printf函数处)设置断点,使用命令“b 33”。
(10)查看断点处设置情况,使用命令“info b”。
(11)运行代码,使用命令“r”。
(12)单步运行代码,使用命令“n”。
(13)查看暂停点变量值,使用命令“p string2[size - i]”。
(14)继续单步运行代码数次,并使用命令查看,发现string2[size-1]的值正确。
(15)继续程序的运行,使用命令“c”。
(16)程序在printf前停止运行,此时依次查看string2[0]、string2[1]…,发现string[0]并没有被正确赋值,而后面的复制都是正确的,这时,定位程序第31行,发现程序运行结果错误的原因在于“size-1”。由于i 只能增到“size-1”,这样string2[0]就永远不能被赋值而保持NULL,故输不出任何结果。
(17)退出Gdb,使用命令q。
(18)重新编辑greet.c,把其中的“string2[size - i] = string1”改为“string2[size – i - 1] =string1;”即可。
(19)使用Gcc重新编译:gcc -g greet.c -o greet。
(20)查看运行结果:./greet
The original string is Embedded Linux
The string afterward is xuniL deddedbmE
这时,正确输出结果。
4. 实验结果
将原来有错的程序经过Gdb调试,找出问题所在,并修改源代码,输出正确的倒序显示字符串的结果。
本文转载于唯C教育,【Linux基础】用Gdb调试有问题的程序
http://www.weicedu.com/forum.php?mod=viewthread&tid=60&fromuid=4
(出处: http://www.weicedu.com/)
 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010926630/article/details/9036633

智能推荐

计算机网络通信技术研究,计算机网络通信技术应用及发展研究_八月篝火的博客-程序员宅基地

【摘要】 计算机网络通信技术中包含了网络技术学科、计算机技术学科还有通信技术学科等,属于多种知识学科的交叉学科。目前社会信息技术发展迅速,计算机网络继续也逐渐被社会各个领域认可和接受,不管是生活和工作,到处都有计算机网络技术的身影。本文分析了目前计算机网络通信技术的现状和问题,并讨论了计算机网络通信技术的发展趋势。【关键词】 计算机 网络通信技术 技术发展目前社会经济不断发展,人们的生活水平越来越...

学生信息管理系统(C语言)_ad'081204的博客-程序员宅基地_学生信息管理系统c语言

高级程序设计:学生管理系统(C语言)本项目可以简单的实现学生信息的增、删、改、查、统计、存储等基本功能:(环境是Dev C++)创建学生信息文件,根据提示输入学生的各项信息,然后按学号对学生信息进行排序,并将排序后的学生信息存储到文件中。增加学生信息,在原有学生信息文件的基础上增加新的学生成绩信息。要求:增加后的学生信息仍按学号排序,并继续保存至原文件。删除学生信息,提示用户输入要进行删...

虚拟内存&管理&虚拟寻址_冥王哈迪尔的博客-程序员宅基地_虚拟内存寻址

特征多次性:无需再作业运行时一次性全部装入内存,而是允许被多次调入内存。对换性:在作业运行时无需一直常驻内存,而是允许在作业运行过程中,将作业换入、换出虚拟性:从逻辑上扩充了内存的容量,使用户看到的内存容量,远大于实际容量。...

仓储物流:计费管理之一 关于收费对象(计费对象)_SAP R3,SBO 学习交流-程序员宅基地

现在的第三方物流仓库,其产生费用基本在3个作业环节:   1)是仓库作业引起收费    2)是运输作业引起收费    3) 在其它作业衍生出的增值服务收费   这些收费因为仓库服务对象和作业的不同会产生不同的收费对象,现总结如下:1:租赁仓库的客户即是货主,则收费对象为该客户。这种情况在现在的仓库中比较多见,比如:xx空调企业,其产品有季节性,备货的情况会因季节的不同而有 较大的差异,因此

php代码庆祝程序员节,2020-1024程序员节首届哔哩哔哩安全挑战赛Write Up_周云歌的博客-程序员宅基地

第一题“页面的背后是什么” 指网页源代码Ctrl+U 查看网页源代码看到向一个地方发送了get请求 发送一个请求,或者直接找找flag1相关的东西就能找到第二题"真正的秘密只有特殊的设备才能看到"指需要使用bilibili Security Browser浏览器访问使用抓包工具抓包把浏览器(UA)伪造成"bilibili Security Browser"需要注意的是如果是Postman需要添加...

python代入命令_命令行运行Python脚本时传入参数的三种方式_weixin_39746241的博客-程序员宅基地

三种常用的方式如果在运行python脚本时需要传入一些参数,例如gpus与batch_size,可以使用如下三种方式。python script.py 0,1,2 10python script.py -gpus=0,1,2 --batch-size=10python script.py -gpus=0,1,2 --batch_size=10123这三种格式对应不同的参数解析方式,分别为sys.a...

随便推点

Confluence WiKi,在国产飞腾CPU的虚拟机上装起来了!_衡水铁头哥的博客-程序员宅基地_飞腾cpu虚拟机

安装操作系统首先创建操作系统,系统选择为CentOS 7,软件适配相对较为全面。安装镜像为CentOS-7-aarch64-Everything-2009.iso,虚拟机配置为:虚拟化环境:H3C CASCPU:16 核心(国产飞腾FT2000+ @ 2.2 GHz)内存:32 GB(DDR4 @ 2666 MHz)硬盘:150 GB(SATA SSD)Confluence官网推荐配置如下:系统选择最小化安装,磁盘分区时手工分区,删掉/home目录。软件环境准备.

1.9.ARM裸机第九部分-定时器、看门狗和RTC_qq_20043187的博客-程序员宅基地

1.9.1.什么是定时器(timer)1.9.1.1、定时器是SoC中常见外设(1)定时器与计数器。计数器是用来计数的(每隔一个固定时间会计一个数);因为计数器的计数时间周期是固定的,因此到了一定时间只要用计数值×计数时间周期,就能得到一个时间段,这个时间段就是我们定的时间(这就是定时器了)。(2)定时器/计数器作为SoC的外设,主要用来实现定时执行代码的功能。定时器相对于So

vitess与mysql的兼容性_zhangjikuan的专栏-程序员宅基地

支持的mysql 版本5.6-8.0,但是5.6 从2021年2月不更新了,所以建议5.7之后版本事务隔离级别vitess: read committedmysql default: pepeatable readSQL语法https://github.com/vitessio/vitess/blob/main/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txtDDLvtctlclient: vitess有封装,使用vtc

java.util.Date_与_java.sql.Date互转_及_字符串转换为日期时间格式_weixin_30300523的博客-程序员宅基地

1、将java.util.Date转换为java.sql.DateJava代码java.util.DateutilDate=newjava.util.Date();java.sql.DatesqlDate=newjava.sql.Date(utilDate.getTime());2、如何将"yyyy-mm-...

bash 返回码范围_bash shell函数中返回任意值的四种方法_隋妹不吃香菜的博客-程序员宅基地

在bash中,函数更像一个子程序,即其返回值,只能是一个数字,以0表示成功,非0表示失败。在bash函数中,返回除了数字之外的值,有三种方法:在bash shell编程中,假如想返回一个字符串,可以有如下的方法。方法1,也是最简单的方法:复制代码 代码示例:function myfunc(){myresult='the value'}myfuncecho $myresult以上方法,通过一个全局变...

android清除textview内容,android – 在TextView文本的一部分上指定“删除”_这件事情足够自信的博客-程序员宅基地

我有一个文本块来自webservice,根据我预定义的一些标签,我想要样式的文本,然后将其设置到我的TextView。对于粗体,斜体和下划线,我可以很容易地使用replaceAll命令:PageText = PageText.replaceAll("\\*([a-zA-Z0-9]+)\\*", "$1");PageText = PageText.replaceAll("=([a-zA-Z0-9]+...