博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Linux基础】用Gdb调试有问题的程序
阅读量:4282 次
发布时间:2019-05-27

本文共 1838 字,大约阅读时间需要 6 分钟。

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调试,找出问题所在,并修改源代码,输出正确的倒序显示字符串的结果。
本文转载于,【Linux基础】用Gdb调试有问题的程序
(出处: )
 
你可能感兴趣的文章
基于OpenLayer的室内地图前端设计开发
查看>>
假如时光倒流,我会这么学习Java
查看>>
Python 学习 基础篇
查看>>
Stitch Fix的创新和突破——用数据的心智经营公司
查看>>
马尔科夫随机场模型(MRF-Markov Random Field)人脸识别原理
查看>>
压力测试工具JMeter入门教程
查看>>
Tuning Your DBMS Automatically with Machine Learning(智能数据库优化系统)
查看>>
计数系统架构实践一次搞定 | 架构师之路
查看>>
可变形卷积网络:计算机新“视”界
查看>>
机器学习和统计学中常见的距离和相似度度量
查看>>
到底什么时候该使用MQ?(MQ使用场景分析)
查看>>
实时离线融合在唯品会的进展
查看>>
一文了解强化学习
查看>>
视频行为识别年度进展
查看>>
SAS首席科学家:如何选择机器学习算法?
查看>>
2017年成为全栈开发工程师的权威指南
查看>>
深度学习入门和学习书籍
查看>>
JVM安全退出(如何优雅的关闭java服务)
查看>>
一文读懂特征工程
查看>>
Spring Boot + Mybatis + Redis二级缓存
查看>>