实验一LinuxC编程工具GCC和GDB
- 格式:docx
- 大小:15.54 KB
- 文档页数:5
编译器gcc
-E 预处理
-S 预处理、编译
-c 预处理、编译、汇编
无-E,-S,-c 预处理、编译、汇编、链接
-o file 制定生成的结果存放到file
-g 在可执行程序中包含调试信息
#include <xxx.h> 预处理在标准头文件路径中搜索xxx.h, Linux平台标准头文件路径:/usr/include
#include "yyy.h" 预处理现在当前目录中搜索yyy.h, 若无,再到标准头文件路径中搜索#include <xxx.h> gcc -I 头文件路径头文件既不在标准头文件,也不在当前路径
-I 添加标准头文件搜索路径
-L 添加标准库文件搜索路径
-static 禁止链接动态库文件,只允许链接静态库文件
-Wall 显示所有GNU提供的警告信息
-O2 优化等级
调试器gdb
info b :查询断点命令
break(b)行号:设置断点
delete(d):删除所有断点
d 断点号:删除断点
step(s):单步(进入子函数或者子程序内部单步) next(n):单步(不进入函数单步)
continue(c):跳过断点继续往下运行
List(l):查看源代码内容
l 行号:从某一行开始查看
print(p)变量:查看断点处运行之后变量的值
r:开始运行。
实验二:gcc、gdb、Makefile的使用●实验目的:(一)学会使用gcc编译器(二)学会gdb调试器的使用(三)学会编写Makefile●实验要求:(一)编写一应用程序,使用gcc进行编译,并分别使用-o,-g,-static,-O2等选项(二)编写一应用程序,使用gdb调试,调试中使用到该小节所介绍的所有命令(三)实现一应用程序,该程序有两个c文件构成,使用makefile来完成对该程序的编译●实验器材:软件:安装了Linux的vmware虚拟机硬件:PC机一台●实验步骤:(一)gcc编译器1、先用vi编辑hello.c文件,内容如下:2、gcc指令的一般格式为:gcc [选项] 要编译的文件 [选项] [目标文件]例:使用gcc编译命令,编译hello.c生成可执行文件hello,并运行hello上面的命令一步由.c文件生成了可执行文件,将gcc的四个编译流程:预处理、编译、汇编、连接一步完成,下面将介绍四个流程分别做了什么工作3、-E选项的作用:只进行预处理,不做其他处理。
例:只对hello.c文件进行预处理,生成文件hello.i,并查看通过查看可以看到头文件包含部分代码#include <stdio.h>经过预处理阶段之后,编译器已将stdio.h的内容贴了进来。
4、-S选项的使用-S选项的作用:只是编译不汇编,生成汇编代码例:将hello.i文件只进行编译而不进行汇编,生成汇编代码hello.s5、-c选项的使用-c选项的作用:只是编译不连接,生成目标文件.o例:将汇编代码hello.s只编译不链接成hello.o文件6、将编译好的hello.o链接库,生成可执行文件hello7、-static选项的使用-static选项的作用:链接静态库例:比较hello.c连接动态库生成的可执行文件hello和链接静态库生成的可执行文件hello1的大小可以看到静态链接库的可执行文件hello1比动态链接库的可执行文件hello要大的多,他们的执行效果是一样的8、-g选项的使用-g选项的作用:在可执行程序中包含标准调试信息例:将hello.c编译成包含标准调试信息的可执行文件hello2带有标准调试信息的可执行文件可以使用gdb调试器进行调试,以便找出逻辑错误9、-O2选项的使用-O2选项的作用:完成程序的优化工作例:将hello.c用O2优化选项编译成可执行文件hello3,和正常编译产生的可执行文件hello进行比较(二)gdb调试器1、先用vi编辑文件test.c用于gdb调试器调试,内容如下#include <stdio.h>int main(void){int sum(int sum);int i,result=0;sum(100);for(i=1;i<=100;i++){result+=i;}printf("The sum in main function is %d\n",result);return 0;}int sum(int num){int i,n=0;for(i=0;i<=num;i++){n+=i;}printf("The sum in sum function is %d\n",n);}2、将test.c文件编译成包含标准调试信息的文件test3、启动gdb进行调试可以看到gdb启动界面中显示了gdb的版本、自由软件等信息,然后进入了有”gdb”开头的命令行界面4、l(list)命令l命令用于查看文件可以看到每行代码面前都有对应的行号,这样方便我们设置断点。
淮海工学院计算机工程学院实验报告书课程名:《Linux程序设计》题目:实验一Linux C编程工具:GCC和GDB班级:软件131学号: 2013122870姓名:王裕一、实验目的与要求1.掌握Linux C开发过程中的基本概念;2.掌握如GCC,GDB等开发工具的使用。
二、实验容1.将参考代码录入到test1.c文件中,编译执行后发现结果与预期不一致,请使用GDB调试,完成字符串反序输出功能。
三、参考源代码#include <stdio.h>#include <stdlib.h>#include <string.h>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.编辑源代码test1.cmkdir test1cd test1gedit test1.c(1)使用gedit编辑器,建议课外学习vim;(2)分析代码中语句功能。
西安邮电大学(计算机学院)课内实验报告实验名称: Linux环境下 C语言编程专业名称:网络工程班级:1203班学生姓名:学号(8位):指导教师:王亚刚实验日期:2014年12月3日一、实验目的(2)掌握gcc编译器使用方法。
(3)掌握gdb调试方法。
二、实验内容1.编辑测试源代码。
2. gcc编译测试源代码3. gdb调试和排错。
三、实验步骤1.编辑如下参考源代码,代码的原意为倒序输出main函数中定义的字符串#include <stdio.h>int display1(char *string);int display2(char *string);p iint main (){char string[] = "nnWelcom to 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[i];string2[size+1] = ' ';printf("The string afterward is %s\n",string2);}2.使用gcc将参考源代码编译为可执行文件。
3.运行可执行文件,观察运行结果并记录。
4.使用gdb调试程序,通过设置断点、单步跟踪,找出错误原因并记录。
漳州师范学院
实验报告
班级 11网络2班学号姓名座号 15 同组人
实验日期成绩
课程名称:操作系统
实验题目:gcc和gdb的使用
实验目的与要求1.掌握Linux操作系统下最常用的c语言编译器gcc的使用;2.掌握Linux操作系统下最常用的代码调试器gdb的使用;3.掌握调试代码的基本方法,如观察变量、设置断点等
实
验
环
境
的
配
置
PC 兼容机。
Window xp 以上操作系统
第 1 页
实验内容与具体步骤将下面的程序输入到一个文件名字为test.c的磁盘文件中,利用调试程序找出其中的错误,修改后存盘。
该程序的功能是显示一个简单的问候语,然后用反序方式将它列出。
漳州师院实验报告
实验内容与具体步骤
实验心得实验中存在的问题及解决办法:
1. 在用gdb进行调试的时候,会运用到一些比如以行号设置断点、以函数名设置断点、以条件表达式设置断点、删除断点、查看和设置变量的值、查看当前设置的断点信息等命令,通过老实讲的以及上网查询的方式找到了这些命令的使用方法。
2. 在编译第一个程序的时候,第一次出现了很多语法错误,通过自己改正了之后解决了这些错误。
3.本次实验学习了一下gcc与gdb的具体使用方法。
并亲自用gdb调试了一下程序。
gdb还是用不熟,只能以后慢慢加深体会了。
注:如果填写内容超出表格,自行添加附页。
漳州师院实验报告。
Linux下C语言程序的编译调试实验学院:电子信息工程学院专业:通信工程*名:***学号:********指导老师:周围老师完成时间:2013年6月3日一、实验目的1. 熟悉Linux下C语言编译调试环境。
2. 学会使用gcc编译C程序。
3. 学会使用gdb调试C程序。
二、实验内容1. 在Linux下,编写程序factorize.c,功能如下:输入一个int型整数,输出其因式分解结果。
2. 编译运行,生成可执行文件。
3. 用gdb调试该程序,找到错误并修改。
三、实验软件环境GCCGCC(GNU Compiler Collection,GNU编译器集合)是一套由GNU工程开发的支持多种编程语言的编译器。
GCC是自由软件发展过程中的著名例子,由自由软件基金会以GPL协议发布。
GCC是大多数类Unix操作系统(如Linux、BSD、Mac OS X等)的标准的编译器,GCC同样适用于微软的Windows。
GCC支持多种计算机体系芯片,如x86、ARM,并已移植到其他多种硬件平台。
GCC原名为GNU C编译器(GNU C Compiler),因为它原本只能处理C语言。
GCC很快地扩展,并支持处理C++。
后来又扩展能够支持更多编程语言,如Fortran、Pascal、Objective-C、Java、Ada、Go等。
GDBGDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。
或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。
所谓“寸有所长,尺有所短”就是这个道理。
一般来说,GDB主要帮助你完成下面四个方面的功能:1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。
(断点可以是条件表达式)。
3、当程序被停住时,可以检查此时你的程序中所发生的事。
淮海工学院计算机工程学
实验报告书
评语:
成绩:指导教师:
批阅时间:年月
实验目的与要求
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 <line_number>
② b <line_number> if condition_expression
③ b <function_name>
(3) 查看中间输出结果:
① p <var>
② set print element 0 p <array_name> 或<pointer>
说明: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:调用静态库文件,编译生成可执行二进制文件
gcc -o main -lmyprint
生成动态链接库()并使用的基本步骤
步骤1:编译, 生成, 目标文件
gcc -c -fpic
注意:GCC选项“-fpic ”表示独立编址,运行时可计算出相应的内部地
址。
步骤2:生成myprint 动态链接库
gcc - shared -o
步骤3:拷贝库文件到/usr/lib 目录下
sudo cp /usr/lib
步骤4:调用动态库文件,编译生成可执行二进制文件
gcc -o main
七、实验体会
本次实验是Linux 的第一次实验,换了一个环境,很不适应,没有鼠标操作的情况下,可以通过上下键来选择vim,gcc 等操作,也极为方便了我们的操作,再有就是gdb,语言代码除了符合最基本的语法规范之外还必须符合设计者的逻辑意图,
如果发现生成的可执行文件运行结果不正确,则可以通过相应的调试环境
来跟踪调试,因此需要用到gdb。
比如,用来查看文件,设置断点,运行程序,查看变量,表达式的值等等,其中的step ,next 等很是重要:单步执行:step 、next,step 命令步入函数,而next 命令步过函数。
step up 将一直执行,直至当前函数将控制返回调用它的函数为止。
另外常见的gdb 命令还有file,kill,list,run,quit,make 等。