linux实验4 编译和调试工具的使用

**

《网络操作系统》实验预习报告

**

一、实验目的
1、练习并掌握Linux提供的vi编辑器来编译C程序
2、学会利用gcc、gdb编译、调试C程序
3、学会使用make工具
二、实验内容
1、GNU C编译器
(1)使用gcc
通常后跟一些选项和文件名来使用gcc编译器。gcc命令的基本用法如下:
gcc [options] [filenames]
命令行选项指定的编译过程中的具体操作
(2)gcc常用选项
当不用任何选项编译一个程序时,gcc将建立(假定编译成功)一个名为a.out的可执行文件。
选项含义:
-o FILE 指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果FILE 没有指定,默认文件名是a.out.
也可用-o选项来为即将产生的可执行文件指定一个文件名来代替a.out。
-c GCC 仅把源代码编译为目标代码。默认时GCC 建立的目标代码文件有一个.o 的
扩展名。
-E 对文件进行预处理
-S 对文件进行编译,生成汇编代码。
-O 对源代码进行基本优化。这些优化在大多数情况下都会使程序执行得更快。
-g 在可执行程序中包含标准调试信息。
-Wall 允许发出GCC 能提供的所有有用的警告,也可以用-W(warning)来标识指定的警告。
-l name 链接静态库
-L dir 库文件的搜索路径
(3)执行文件
格式: ./可执行文件名
2、gdb调试工具
(1)调试编译代码
为了使gdb正常工作,必须使你的程序在编译时包含调试信息。调试信息里包含你程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。gdb利用这些信息使源代码和机器码相关联。
在编译时用 –g 选项打开调试选项。
(2)gdb基本命令
命 令 描 述
file 装入欲调试的可执行文件
kill 终止正在调试的程序
list 列出产生执行文件的源代码部分
next 执行一行源代码但不进入函数内部
step 执行一行源代码并进入函数内部
run 执行当前被调试的程序
quit 终止gdb
watch 监视一个变量的值而不管它何时被改变
break 在代码里设置断点,使程序执行到这里时被挂起
make 不退出gdb就可以重新产生可执行文件
shell 不离开gdb就执行UNIX shell 命令
三、预习心得
这部分实验内容我感觉较难,要掌握的东西也很多!需要掌握Linux提供的vi编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序,学会使用make工具,这些都是重点

**

《网络操作系统》实验报告

**

一、实验目的
1.练习并掌握Linux提供的vi编辑器来编译C程序
2.学会利用gcc、gdb编译、调试C程序
3.学会使用make工具
二、实验内容
1、GNU C编译器
(1)使用gcc
通常后跟一些选项和文件名来使用gcc编译器。gcc命令的基本用法如下:
gcc [options] [filenames]
命令行选项指定的编译过程中的具体操作
(2)gcc常用选项
当不用任何选项编译一个程序时,gcc将建立(假定编译成功)一个名为a.out的可执行文件。
选项含义:
-o FILE 指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果FILE 没有指定,默认文件名是a.out.
也可用-o选项来为即将产生的可执行文件指定一个文件名来代替a.out。
-c GCC 仅把源代码编译为目标代码。默认时GCC 建立的目标代码文件有一个.o 的
扩展名。
-E 对文件进行预处理
-S 对文件进行编译,生成汇编代码。
-O 对源代码进行基本优化。这些优化在大多数情况下都会使程序执行得更快。
-g 在可执行程序中包含标准调试信息。
-Wall 允许发出GCC 能提供的所有有用的警告,也可以用-W(warning)来标识指定的警告。
-l name 链接静态库
-L dir 库文件的搜索路径
(3)执行文件
格式: ./可执行文件名
2、gdb调试工具
(1)调试编译代码
为了使gdb正常工作,必须使你的程序在编译时包含调试信息。调试信息里包含你程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。gdb利用这些信息使源代码和机器码相关联。
在编译时用 –g 选项打开调试选项。
(2)gdb基本命令
命 令 描 述
file 装入欲调试的可执行文件
kill 终止正在调试的程序
list 列出产生执行文件的源代码部分
next 执行一行源代码但不进入函数内部
step 执行一行源代码并进入函数内部
run 执行当前被调试的程序
quit 终止gdb
watch 监视一个变量的值而不管它何时被改变
break 在代码里设置断点,使程序执行到这里时被挂起
make 不退出gdb就可以重新产生可执行文件
shell 不离开gdb就执行UNIX shell 命令

三、实验操作
1、用gcc编译程序,写出编译过程,并给出运行结果。
mypow.c:定义mypow()函数
在这里插入图片描述

powtest.c:调用mypow()函数
在这里插入图片描述
在这里插入图片描述

(1)先创建两个源文件mypow.c和powtest.c,编译源程序代码
在这里插入图片描述

(2)使用命令gcc -o test powtest.c mypow.c将文件powtest.c和 mypow.c编译成可执行文件test
(3)根据提示安装gcc ,安装成功,test可执行文件编译成功。

在这里插入图片描述

(4)运行程序,执行./test 10 10 命令测试例子10的10次方结果,运行成功。
在这里插入图片描述

2、调试程序,要求用gdb进行调试并给出修改方案。
(1)源程序的功能:按照正序和逆序输出给定的字符串。要求用gdb进行调试,分析出错的原因并给出修改方案。
#include <stdio.h>
#include <string.h>
#include <malloc.h>
void my_print (char *string);
void my_print2 (char *string);
int main()
{
char my_string[] = “hello there”;
my_print (my_string);
my_print2 (my_string);
return 0;
}
void my_print (char *string)
{
printf (“The string is %s\n”, string);
}
void my_print2 (char *string)
{
char *string2;
int size, i;
size = strlen (string);
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size - i] = string[i];
string2[size + 2] = ‘\0’;
printf (“The string printed backward is %s\n”, string2);
}

(1)先创建源文件gdbtest.c,编译源程序代码
在这里插入图片描述

(2)gcc gdbtest.c -o gdbtest -g 将源文件gdbtest.c编译成可执行文件gdbtest
在这里插入图片描述

(3)gdb gdbtest 进入gdb调试环境
在这里插入图片描述

(4)b23 在23行设置断点
i b并查看断点

在这里插入图片描述

(5)display +变量名 next一行一行执行代码并显示
在这里插入图片描述

(6)发现错误 将string的\0赋值给了string2的首元素
在这里插入图片描述

(7)改进代码 将size-i 改为size-i-1,修改可执行文件
在这里插入图片描述

(8)调试修改后的程序并执行next命令一行一行显示
在这里插入图片描述

(9)执行新的可执行文件,结果运行成功
在这里插入图片描述

3、make的使用
(1)用vi编辑以下程序,程序清单:
//main.c
function1.h
function1.c
function2.h
function2.c
//main.c
#include “function1.h”
#include “function2.h”
int main(int argc, char **argv)
{
function1_print(“hello”);
function2_print(“world”);
return 0;
}
在这里插入图片描述

//function1.h

void function1_print(char *str);
在这里插入图片描述

//function1.c
#include “function1.h”
void function1_print(char *str)
{
printf(“This is function1 print %s\n”, str);
}
在这里插入图片描述

//function2.h

void function2_print(char *str);
在这里插入图片描述

//function2.c
#include “function2.h”
void function2_print(char *str)
{
printf(“This is function2 print %s\n”, str);
}
在这里插入图片描述

(2)实验要求:
a)画出各个源程序、目标文件以及最终的目标文件之间的依赖关系图。
在这里插入图片描述

b)编辑makefile文件
在这里插入图片描述

c)利用make命令进行上述程序的编译prog可执行文件,并运行。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

d)修改其中一个源文件,重新make,察看编译过程。
在这里插入图片描述

e)通过使用makefile变量和隐含规则,对makefile文件进行简化

在这里插入图片描述
在这里插入图片描述

四、源程序清单、测试数据及结果
(1)运行程序,执行./test 10 10 命令测试例子10的10次方结果,运行成功。
在这里插入图片描述

(2)执行新的可执行文件,结果运行成功
在这里插入图片描述

(3)运行原程序,和修改后的程序
在这里插入图片描述
在这里插入图片描述

(4)具体步骤见步骤三
五、实验小结
通过自己做这次实验,整体感觉还行,第一部分gcc内容,较简单。第二部分gdb我搞了好久,因为我c语言功底不好,第三部分make部分 主要是makefile那块,需要好好理解~

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值