北京林业大学
2013学年—2014学年第 2 学期 Linux应用实验任务书专业名称:班级:
姓名:学号:
实验题目:实验三 GNU下编译器和调试器的使用初步
实验环境: Linux环境
实验目的:
通过调试一个有问题的程序,进一步熟练使用Vi 操作,而且熟练掌握Gcc 编译及Gdb 的调试命令,通过对有问题程序的跟踪调试,进一步提高发现问题和解决问题的能力。
实验内容:
GNU GCC:
编译单个源文件
#include
#include
int main(int argc, char **argv)
{printf(“Hello world! \n”);
exit(0);
}
输入:wq 保存并退出
用gcc编译
简单编译两个源文件
#include
void goodbye_world(void);
{ printf(“Goodbye, world! \n”);
}
使用gcc的“-c”标记来编译支持库代码:
# gcc -c 文件名.c
这一过程的输出结果是一个名为文件名.o的文件,它包含适合连接到一个较大程序的已编译目标代码。
创建一个简单的示例程序,它包含一个调用上个程序里的goodbye_world的main 函数。
#include
void goodbye_world(void);
int main(int argc, char **argv)
{ goodbye_world();
exit(0);
}
使用gcc编译这个程序:
# gcc -c main.c
现在有了两个目标文件:message.o 和main.o。它们包含能够被Linux 执行的目标代码。要从这个目标代码创建Linux可执行程序,需要再一次调用gcc 来执行连接阶段的工作:
使用外部函数库
GCC常常与包含标准例程的外部软件库结合使用,几乎每一个Linux 应用程序都依赖于由GNU C 函数库GLIBC。
// 请编写代码计算sin30度+ sin60度+sin90度,并完成编译,执行
提示:头文件的使用且GCC编译时使用数学库参数。函数库位置随系统的不同而不同,但它一般会位于目录/lib或/usr/lib中,在这些目录中还有数以百计的其他必需的系统函数库。
GNU GDB:
(1)使用Vi 编辑器,将以下代码输入到名为greet.c 的文件中。此代码的
原意为输出倒序main函数中定义的字符串,但结果显示没有输出。代码
如下所示:
(2)使用Gcc 编译这段代码。
(3)运行生成的可执行文件,观察运行结果。
(4)使用Gdb 调试程序,通过设置断点、单步跟踪,一步步找出错误所在。
(5)纠正错误,更改源程序并得到正确的结果。
实验步骤:
(1)在工作目录上新建文件greet.c,并用Vi 启动:vi greet.c。
(2)在Vi 中输入以上代码。
图1
(3)在Vi 中保存并退出:wq。
(4)用Gcc 编译:
(5)运行greet:./greet,输出为:
可见,该程序没有能够倒序输出。
(6)启动Gdb 调试:
(7)查看源代码并进行调试。
将原来有错的程序经过Gdb调试,找出问题所在,并修改源代码,输出正确的倒序显示字符串的结果。实验步骤中请适当截图。GNU调试器是一个功能非常强大的工具。要了解更加详尽的知识,建议阅读GNU调试器手册。
LINUX环境下的编程实现:
my1.dat
请用深度优先搜索或广度优先搜索对上图的文件系统树进行遍历。
#include
#include
#include
using namespace std;
void DFS(int G[8][8],int v);
int visit[8]={0,0,0,0,0,0,0,0};
string name[8]={"/","dirC","dirA","my3.dat","dirB",
"my1.dat","my2.dat","my1.dat"};
int main()
{
/*0
1 2
3 4 5 6
7
*/
int G[8][8]={0,1,1,0,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0};
DFS(G,0);
return 0;
}
void DFS(int G[8][8],int v)
{
int w=0;
cout<
visit[v]=1;
for(w=0;w<8;w++)
if((G[v][w]!=0)&&(visit[w]==0))
DFS(G,w);
}
实验中存在的问题及解决办法:
树的遍历使用VC6.0可编译运行,移植到Vi后出错。