实验一LinuxC编程工具GCC和GDB

合集下载

Linux编译器gcc和调试器gdb

Linux编译器gcc和调试器gdb

编译器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:开始运行。

Linu 系统编程实验gccgdb的使用以及Makefile文件的编写

Linu 系统编程实验gccgdb的使用以及Makefile文件的编写

实验二: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命令用于查看文件可以看到每行代码面前都有对应的行号,这样方便我们设置断点。

第3章-GCC和GDB

第3章-GCC和GDB

可进行的操作方式
预处理、编译、汇编、链接
生成选项
预处理、编译、汇编、链接 编译、汇编、链接 编译、汇编、链接 -E -E
.s
.S
预处理后的汇编程序
未预处理的汇编程序
汇编、链接
预处理、汇编、链接
-S
-S
.h
.o .a .so
头文件
目标文件 静态库文件 动态库文件
不进行任何操作
链接 不进行任何操作 不进行任何操作 -C
gcc编译流程 – 第二步:编译
编译成功后,使用cat 指令查看gcc-test.s的文件 信息:
gcc编译流程 – 第二步:编译
编译总结:

找出源文件中的语法的错误,没有错误生成 汇编文件 因此基本上的错误显示都是在该步骤出现

gcc编译流程 – 第三步:汇编
在这个阶段中,gcc将对汇编文件进行处理: 将编译阶段生成的.s汇编文件翻译成二进制 机器代码。 可以通过gcc的选项-c来执行汇编,并生成gcctest.o的文件:
linux下的库有两种:静态库和共享库(动态库)。 二者的不同点在于代码被载入的时刻不同。


静态库的代码在编译过程中已经被载入可执 行程序,因此体积较大。“空间换时间” 共享库的代码是在可执行程序运行时才载入 内存的,在编译过程中仅简单的引用,因此 代码体积较小。 “时间换空间”
库存在的意义
这个库为线程库
gcc基本编译选项
-Wall :表示产生所有警告。 未使用的变量 有类型的函数,无返回值 不同类型变量的赋值
-W
-Werror:含义是将所有警告作为错误(error),即出现 警告就停止编译。
gcc基本编译选项 总结

实验一-LinuxC编程工具GCC和GDB

实验一-LinuxC编程工具GCC和GDB

淮海工学院计算机工程学院实验报告书课程名:《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语言编程实验报告

Linux环境下 C语言编程实验报告

西安邮电大学(计算机学院)课内实验报告实验名称: 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调试程序,通过设置断点、单步跟踪,找出错误原因并记录。

实验一 gcc和gdb的使用

实验一  gcc和gdb的使用

3.执行当前目录下编译生成的可执行文件,使 用以下格式: ./可执行文件名 ./a.out
也可以使用以下方法编译源代码文件.生成自 命名的可执行文件; gcc源文件-o自命名的文件名 例如:gcc test.c –o test
4.gdb简介 Linux包含了一个叫gdb的GNU调试程序。gdb是一个 用来调试c和c十十程序的强力调试器。它使用户能在 程序运行时观察程序的内部结构和内存的使用情况。 以下是gdb所提供的一些功能: 能监视程序中变量的值; ·能设置断点以使程序在指定的代码行上停止执行; ·能一行行地执行代码。
在命令行上键入gdb并按回车键就可以运行gdb 了, 如果一切正常的话,gdb将被启动,并且将 在屏幕上显示类似的内容:
实验内容 将下面的程序输入到一个文件名字为 test.c的磁盘文件中,利用调试程序找出 其中的错误,修改后存盘。该程序的功 能是显示一个简单的问候语,然后用反 序方式将它列出。
实பைடு நூலகம்一 gcc和gdb的使用
实验目的 1.掌握Linux操作系统下最常用的c 语言编译器gcc的使用 2.掌握Linux操作系统下最常用的 代码调试器gdb的使用; 3.掌握调试代码的基本方法,如 观察变量、设置断点等。
gcc简介 gcc 是Linux操作系统下一种常用的c语言编译器。 1.使用文本编辑器编写完源程序,保存成 .c为扩展名的c语言源代码文件。 2.返回到shell界面,使用gcc对源程序进行编泽 其命令为: gcc 源程序 例 : gcc test.c 如果源代码没有语法错误,使用以上命令编译,会在 当前目录下生成一个名为a.out的可执行文件。如果源代码 有语法错误,则不会生成任何文件,gcc编译器会在shell 中提示错误的地点和类型。(可使用gdb来调试)

gcc和gdb的使用 linux

gcc和gdb的使用 linux

漳州师范学院
实验报告
班级 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还是用不熟,只能以后慢慢加深体会了。

注:如果填写内容超出表格,自行添加附页。

漳州师院实验报告。

gcc_gdb

gcc_gdb



file (可执行 目标程序 (二进制))
▲ 汇编阶段 接下来在命令行输入(as file.s -o file.o) 汇编器将file.s翻译成机器语 言指令,把这些指令打包成为一种叫做可重定位目标程序格式,并将结果保存在目 标文件(file.o) 中, file.o文件是一个二进制文件,它的字节编码是机器语言指令而 不是字符,如果我们在文本编辑器中打开file.o文件,呈现的将是一堆乱码. ▲ 链接阶段 然后在命令行中输入: ld file.o -lc /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o --dynamic-linker /lib/ld-linux.so.2 -o file 注意我们的程序调用了printf函数,它是标准C库的一个函数,printf函数对应的 标文件printf.o是存放在标准C库的共享库文件libc.so.6中的。因此,必须在链 接时,将libc.so.6中的printf.o合并到输出文件file中。此外,为了建立程序在 执行时的运行环境,我们还必须把建立和支持运行环境的目标文件crt1.o、 crti.o、crtn.o和动态连接库文件ld-linux.so.2(在参数--dynamic-linker后指 定)合并到输出文件file中。
gcc/gdb简要入门
本文档由电子信息科学与技术系2006级的孙学婷同学撰写, 介绍了在Linux下使用gcc和gdb来编译和调试C程序的基本方 法,略有修正。在此向她表示感谢!
实验平台:计算机,Linux系统及其编程工具 (一)gcc和gdb简介
GCC原本是”GNU C Compiler”的意思,但是它不只是C语言的不编译器,现在能够 支持多种其他语言,包括C++,Java等.它使用可替换的后端处理器,以产生适合于不同 算机体系结构上的可执行文件。gcc手册网址:/onlinedocs/。 GDB(GNU symbolic debugger)GNU开源组织发布的一个强大的UNIX下的 程序调试工具。 它的重要工作就是测试程序和排除错误,实际上它就是一个程序,可 以在一个严密的环境中执行另一个程序. gdb手册网址:/software/gdb/documentation/
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 <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 等。

相关文档
最新文档