实验一LinuxC编程工具GCC和GDB
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
淮海工学院计算机工程学
实验报告书
评语:
成绩:指导教师:
批阅时间:年月
实验目的与要求
1. 掌握Linux C 开发过程中的基本概念;
2. 掌握如GCC GDB等开发工具的使用。
二、实验内容
1. 将参考代码录入到文件中,编译执行后发现结果与预期不一致,请使用GDE调试,
完成字符串反序输出功能。
三、参考源代码
#include <>
#include <>
#include <>
int reverse_str(char *string);
int main (void) {
char string[] = "Linux C Tools : GCC and GDB"; printf ("The original string is %s \n", string); reverse_str (string);
}
int reverse_str (char *str) {
char *new_str;
int i, size;
size = strlen (str);
if((new_str = (char *) malloc (size + 1)) == NULL) { return -1;
}
for (i = 0; i < size; i++)
new_str[size - i] = str[i];
new_str[size+1] = ' ';
printf("The reversed string is %s\n",new_str); free(new_str);
return 0 ;
}
四、实验步骤
步骤1. 编辑源代码
mkdir test1
cd test1
gedit
(1) 使用gedit 编辑器,建议课外学习vim;
(2) 分析代码中语句功能。
步骤 2. 编译源代码
gcc -o test1 -g
(1) 复习gcc 常用选项;
(2) 帮助学生排查编译时错误。
(3) 分析输出结果步骤3. 调试test1
gdb test1
(1) 回顾调试的基本方法:跟踪语句执行过程,观察执行结果;
(2) 设置断点的三种基本方法:
① b
② b
③ b
(3) 查看中间输出结果:
① p
② set print element 0 p
说明:GDB中查看字符串变量值可通过“ set print element 0 ”命令,一次性显示字符串所有内容。
(4) 分析中间结果,修改28 行语句为new_str[size - i-1] = str[i];
五、实验结果与截图
1. 编写文件并编译
2. 设置断点,进行gdb 测试跟踪变量。执行到i=27 时size-i=0 ,str[27] 已经超过str 字符串限制,于是new_str[0]= '\0 '。
输出new_str 时,由于超过限制无法输出。所以修改程序第28行语句为new_str[size - i-1] = str[i];
正确的程序运行结果如下图所示。
六、思考题
1. 分析以下代码,完成指定范围内数值累加功能:
#include <>
/* 函数功能:将low 到high 之间的数值累加求和*/
int add_range(int low, int high) {
int i, sum;
for (i = low; i <= high; i++)
sum = sum + i;
return sum;
}
int main(void) {
int result[2];
result[0] = add_range(1, 10);
result[1] = add_range(1, 100);
printf("result[0]=%d\nresult[1]=%d\n", result[0], result[1]);
return 0;
}
答:进行累加时,局部变量sum的值会被内存保存下来,会导致数值错误,要对其初始化为0。
把int i,sum; 改为int i;int sum = 0;
2.结构化编程经常将相近功能编译成库形式,方便调用。请查阅资料,使用GCC各一
组功能相关的源文件编译成静态库或动态库?建立库文件的源文件和如下所示:/* */
#include <>
void print1(int arg) {
printf("%d\n", arg);
}
/* */
#include <>
void print2(char* arg) {
printf("%s\n", arg);
}
调用库函数的源文件为如下:
/* */
void print1(int arg);
void print2(char* arg);
int main(int argc, char* argv[]) {
int i = 3;
char* str = "test libary!\n";
print1(i);
print2(str);
return 0 ;
}
生成静态库()并使用的基本步骤
步骤1:编译, 生成, 目标文件
gcc -c
步骤2:生成myprint 静态库文件
ar -r
步骤3:拷贝库文件到/usr/lib 目录下
sudo cp /usr/lib
说明:若不将静态链接库拷贝到/usr/lib 目录下,在调用该库时需通过GCC选项丄指定库文件所在路径
步骤4:调用静态库文件,编译生成可执行二进制文件