实验题目
安装Linux环境,并进行简单程序的编译和GDB调试。
实验目的
本实验为课程预备实验,要求成功安装linux基本环境,并进行简单程序的编译和GDB调试,从而为后续课程实验搭建基础运行平台。
实验环境
个人电脑、linux发行版本
实验内容及操作步骤
第一步,在电脑平台上安装linux系统与环境;
第二步,成功在linux系统中使用gcc完成简单c语言的编译和执行;
第三步,使用GDB进行程序基本的程序调试和反汇编。
安装Linux所遇到的问题
1.vim编辑模式下如何复制粘贴代码
复制到光标位置
按Esc退出输入,按y+y直接复制光标所在行的内容,按p粘贴
2.鼠标键盘被虚拟机占用,无法回到实体机界面。
这个问题刚开始我也不知道怎么解决,也就随便乱霍霍,后来发现原因是自己没注意虚拟机的提示。对于virtualbox,解除鼠标占用的热键是右边的ctrl。
关于安装Linux并没有遇到特别多的问题,倒是在写实验的时候遇到了好多问题
1.使用gcc完成简单的编译与执行
预编译
gcc -E hello.c -o hello.i
说明:
-E,只预编译。直接输出预编译结果。
-E进行预编译时,将输出信息,将程序所包含的头文件,函数,宏定义等,进行扩展。
编译
gcc -S hello.i -o hello.s
说明:
S,只执行到源代码到汇编代码的转换,输出汇编代码。
汇编
gcc -c hello.s -o hello.o
-o, 指定输出文件名 该参数可以省略。默认下(gcc sourceFile.c):生成名为a.out的可执行文件。
-c:生成名为hello.o目标文件。(进行编译,不链接)
例:
2.如何使用gdb调试,进行反汇编以及遇到的问题
例:
生成可执行文件以及调试程序
单步执行,运行程序,停在第一行执行语句
运行程序(由于我没有设置断点,所以问我是否是从一开始就开始)
设置断点为2,并且run
n: 执行一行源程序代码,此行代码中的函数调用也一并执行。
list :简记为 l ,其作用就是列出程序的源代码,默认每次显示10行。
查看寄存器,第一数列是寄存器的名称,第二数列是十六进制 第三数列是十进制
查看断点的内容
退出gdb调试
3.gdb调试中出现的问题
输入 ld test1.o -o test1 结果出现问题,说找不到条件目录???明明按照老师所演示的步骤来,为什么不行,后来才发现 as和ld压根跟gcc不是一个东西,如果是汇编程序,就用as和ld;如果是c程序,就用gcc
当我没有设置断点,但是run了之后,不能执行一行源程序代码,有可能是因为没有设置断点,不知道是执行哪一行代码。
查看ebx寄存器时,告诉我并没有这个寄存器
(info reg)查看所有寄存器,但是没有寄存器!!!直到之后设置了断点,才可以出现。
实验结果及分析:
在电脑平台上已成功安装linux系统与环境;
成功在linux系统中使用gcc完成简单c语言的编译和执行;
成功使用GDB进行程序基本的程序调试和反汇编。
反调试之前,首先得学会程序的转换过程,以及了解gcc的常用命令
在进行写代码以及反调试时,不要写错了,写错了已经进行下一步,就不能更改。
收获与体会:
更加熟练的使用gcc,并且由于这次调试,更加了解了gdb的使用方法以及用处。在调试过程中,出现了许多问题,上网查询资料可以获得许多帮助。
之后进行调试时,也一定要灵活使用断点来帮助自己找到问题所在