前言
本实验为课程预备实验,要求成功安装linux基本环境,并进行简单程序的编译和GDB调试,从而为后续课程实验搭建基础运行平台。
仅供参考!
一、在所使用的电脑平台上安装linux系统与环境
- 下载并安装VMware Workstation Pro
- 安装成功之后打开VMware
经过以上一系列操作便可创建好虚拟机
二、成功在linux系统中使用gcc完成简单c语言的编译和执行
- 使用
gedit hello.c
命令在主文件夹下创建一个hello.c文件
- 在hello.c文件中编写程序后将其保存
- 预处理阶段:使用
gcc -E hello.c -o hello.i
gedit hello.i
得到预处理之后的hello.i文件(文本)
- 编译阶段:使用
gcc -S hello.i -o hello.s
gedit hello.s
得到汇编代码(文本)
- 汇编阶段:使用
gcc -c hello.s -o hello.o
gedit hello.o
得到可重定向目标程序(二进制)
- 链接阶段:使用
gcc hello.o -o hello
gedit hello
得到可执行目标程序(二进制)
- 运行阶段:使用
./hello
得到运行结果
三、使用GDB进行程序基本的程序调试和反汇编
- 输入命令
gcc -g hello.c -o hello
开始调试(-g选项告诉gcc在编译程序时加入调试信息)、输入gdb hello
得到以下版本信息说明
- 输入
gdb -q hello
可忽略版本信息,得到以下界面
- 输入
file hello
,先进入gdb模式,再加载文件,得到以下界面
- 输入
y
之后输入list
得到以下界面
- 输入
break 4
表示在第四行代码处设置断点,得到以下代码
Breakpoint 1表示这是我设置地第一个断点,断点所在地内存地址为0x80483dd
,它在文件hello.c的第四行 - 输入
info breakpoints
可查看设置的断点信息,得到以下界面
Num表示断点的编号;Type表示断点的断点的类型;Disp表示中断点在执行一次之后是否失去作用,dis为是,keep为不是;Enb表示当前中断点是否有效,y为是,n为否;Address表示中断点所处的内存地址;What指出断点所处的位置。 - 断点设置好之后可以输入
run
开始调试,得到以下界面
- 输入
next
,继续执行下一条语句;还有一条命令step,与之类似,不同的是,当下一条语句遇到函数调用的时候,next不会跟踪进入函数,而是继续执行下面的语句,而step命令则会跟踪进入函数内部。
- 输入
quit
退出调试
实验结果及分析
经过调试发现代码编译通过且能够运行出正确的结果;
运行结果:Hello world!
这是一条最简单的语句,基本上只要你的固定格式没有出错程序就不会报错。
收获与体会
- 在安装VMware Workstation Pro的时候出现了安装不了的情况,安装失败之后试图安装别的版本仍然失败;解决:在任务管理器中关掉了Windows安装程序之后安装成功
- 安装成功之后显示我没有权限输入产品密钥,试图以管理员身份打开输入密钥仍然无效;解决:卸载程序之后以管理员身份安装该程序,之后输入密钥成功
- 使用Ubuntu进行编译和运行程序的时候输入
touch 文件名.c
可以在主文件夹目录下创建一个文件名.c文件,找到该文件,在里面编写代码,保存即可 - 创建文件也可以使用
gedit 文件名.c
形式(该文件也会创建在主文件夹目录下) - 指令
cd 目录
可以更换路径 - 预处理/编译/汇编/链接/运行阶段的指令均可参见上面
- 如果不需要程序在该断点暂停时,有两种方法,一种是使该断点失效,一种是直接删除该断点。
可以看到此时Enb这一栏中是n,表明断点1失效 - 如果需要恢复,可以使用enable命令。这里需要注意的是,disable后面的参数为断点的编号。而不是行号。
- next表示继续执行下一条语句;还有一条命令step,与之类似,不同的是,当下一条语句遇到函数调用的时候,next不会跟踪进入函数,而是继续执行下面的语句,而step命令则会跟踪进入函数内部。
- 可以在gdb的提示符中,输入
shell
,然后在输入你需要的命令就可以了
再输入clear
可以达到清屏的作用 - 直接删除该断点,可以使用clear命令和delete命令。
- 调试过程设置断点的时候,最好设置在容易出错的地方,这样方便之后的调试,提高效率