信息安全系统设计基础第二周学习总结(20135213)

一、课程资料私有课 《深入理解计算机系统》

 实验一:(上节课内容总结)

(PS:实验一详见上节课笔记部分)

实验二:

vim部分(基础课 Vim编辑器在下个博客,链接:http://www.cnblogs.com/20135213lhj/p/4841491.html)

 gcc、gdb、make与makefile部分(下方第三部分详细了解)

二、课程资料基础课 Vim编辑器

(详见下个博客,链接:http://www.cnblogs.com/20135213lhj/p/4841491.html)

编辑器之神与神的编辑器》很有趣,简略的介绍了Emacs和Vim的情况。

 

三、课程资料:基础课 Linux系统编程,实验2、3、4

实验2:编译器gcc的使用

1. gcc 支持编译的一些源文件后缀名

后缀源文件
.c C语言源文件
.C .cc .cxx C++源文件
.m Object-C源文件
.i 经过预处理后的C源文件
.ii 经过预处理后的C++源文件
.s .S 汇编语言源文件
.h 预处理文件(头文件)
.o 目标文件
.a 存档文件

2. gcc 编译程序的流程

图片描述信息

Tips:

  1. Linux的可执行文件并没有像 Windows 那样有明显的.exe后缀名, 只需向其分配x(可执行)权限即可 sudo chmod u+x excutefile
  2. 作为Linux程序员,我们可以让gcc在编译的任何阶段结束,以便检查或使用该阶段的输出(这个很重要)

3. 用 gcc 编译一个经典 C 程序

注意:可以使用GVim编辑器进行代码输入,代码块中的注释可以不需输入。

Tips;

  1. gcc hello.c -o hello --- 第二个hello为文件名,名字任意取定(但是不能违反bash的规则) gcc hello.c -o "(-_-|||)", 但是作为一名优秀的程序员还是取个有意义的名字吧!
  2. 从程序员的角度来看,一个简单的-o选项可以省略很多中间步骤一次性输出可执行文件; 但从编译器的角度来看,这条命令的背后是一系列的繁杂的工作。

实验三:GDB 使用

gdb 概 述

当程序编译完成后,它可能无法正常运行;或许程序会彻底崩溃;或许只是不能正常地运行某些功能;或许它的输出会被挂起;或许不会提示要求正常的输入。无论在何种情况下,跟踪这些问题,特别是在大的工程中,将是开发中最困难的部分,我们将学习gdb(GNU debugger)调试程序的方法,该程序是一个调试器,是用来帮助程序员寻找程序中的错误的软件。

gdb是GNU开发组织发布的一个强大的UNIX/Linux下的程序调试工具。或许,有人比较习惯图形界面方式的,像VC、BCB等IDE环境,但是在UNIX/Linux平台下做软件,gdb这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。 一般来说,gdb主要帮忙用户完成下面4个方面的功能:

  1. 启动程序,可以按照用户自定义的要求随心所欲的运行程序。
  2. 可让被调试的程序在用户所指定的调试的断点处停住 (断点可以是条件表达式)。
  3. 当程序停住时,可以检查此时程序中所发生的事。
  4. 动态地改变程序的执行环境。
  5. 从上面来看,gdb和一般的调试工具区别不大,基本上也是完成这些功能,不过在细节上,会发现gdb这个调试工具的强大。大家可能习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。­­­­­­­­­­­­­­­­­­­­­­­­­­­

使 用 gdb

gdb主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数即可。如:

$ gcc -g hello.c -o hello
$ g++ -g hello.cpp -o hello

有-g,将看不见程序的函数名和变量名,代替它们的全是运行时的内存地址。当用-g把调试信息加入,并成功编译目标代码以后,看看如何用gdb来调试。 启动gdb的方法有以下几种:

  1. gdb <program> program也就是执行文件,一般在当前目录下。
  2. gdb <program> core 用gdb同时调试一个运行程序和core文件,core是程序非法执行后,core dump后产生的文件。
  3. gdb <program> <PID> 如果程序是一个服务程序,那么可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试它。program应该在PATH环境变量中搜索得到。 gdb启动时,可以加上一些gdb的启动开关,详细的开关可以用gdb -help查看。

下面列举一些比较常用的参数: -symbols -s 从指定文件中读取符号表。 -se file 从指定文件中读取符号表信息,并把它用在可执行文件中。 -core -c 调试时core dump的core文件。 -directory -d 加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。

作业:

实验四:Makefile 使用

Makefile 简介

读者经常看到一个C程序的项目常常由很多的文件组成,那么,多文件的好处到底在哪里呢?一个最简单也最直接有力的理由就是,这样可以将一个大项目分成多个小的部分,独立开来,利于结构化管理。在修改和维护的时候,优势就更明显了。例如,需要对代码做一点小的改动,如果这个项目所有的代码都在一个文件中,那么就要重新编译所有这些代码,这是很耗时的,不仅效率低,而且维护难度更大。但是,如果是多个不同的文件,那么只需要重新编译这些修改过的文件就行了,而且其他源文件的目标文件都已经存在,没有必要重复编译,这样就会快捷很多。

因此,通过合理有效的划分,将一个项目分解为多个易于处理的文件,是非常明智的做法。多文件的管理方式非常正确的选择。

一个工程中的源文件不计其数,按其类型、功能、模块分别放在若干个目录中。makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至进行更复杂的功能操作(因为makefile就像一个shell脚本一样,可以执行操作系统的命令)。

makefile带来的好处就是——“自动化编译”,一但写好,只需要一个make命令,整个工程完全编译,极大的提高了软件的开发效率。make是一个命令工具,是一个及时makefile中命令的工具程序。

make工具最主要也是最基本的功能就是根据makefile文件中描述的源程序至今的相互关系来完成自动编译、维护多个源文件工程。而makefile文件需要按某种语法进行编写,文件中需要说明如何编译各个源文件并链接生成可执行文件,要求定义源文件之间的依赖关系。

Makefile 基本规则

如上所示,这样就能生成可执行文件test,由于程序比较简单,而且数量也比较少,因此看不出来有多麻烦。但是,试想如果不只上面的3个文件,而是几十个或者是成百上千个甚至更多,那将是非常复杂的问题。这就是makefile的绝佳舞台,下面是一个简单的makefile的例子。

首先$ vim Makefile

有了这个Makefile,不论什么时候修改源文件,只要执行一下make命令,所有必要的重新编译将自动执行。make程序利用Makefile中的数据,生成并遍历以test为根节点的树;现在我们以上面的实例,来学习一下Makefile的一般写法:

test(目标文件): prog.o code.o(依赖文件列表)
tab(至少一个tab的位置) gcc prog.o code.o -o test(命令)

一个Makefile文件主要含有一系列的规则,每条规则包含一下内容:一个目标,即make最终需要创建的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如‘clean’;一个或多个依赖文件的列表,通常是编译目标文件所需要的其他文件。之后的一系列命令,是make执行的动作,通常是把指定的相关文件编译成目标文件的编译命令,每个命令占一行,并以tab开头(初学者务必注意:是tab,而不是空格) 执行以上Makefile后就会自动化编译:

$ make
gcc -c prog.c -o prog.o
gcc -c code.c -o code.o
gcc prog.o code.o -o test

最后就会多产生: porg.o code.o test这三个文件,执行./test查看结果

还记得Makefile中的clean吗?make clean就会去执行rm -f *.o test这条命令,完成 clean 操作。

使用带宏的 Makefile

Makefile还可以定义和使用宏(也称做变量),从而使其更加自动化,更加灵活,在Makefile中定义宏的格式为:

macroname = macrotext

使用宏的格式为:

$(macroname)

四、遇到的问题及解决方法

1.vim不熟练然后又觉得好玩,错误操作直接在文本上面改,然后就发现删了之后什么都看不懂了。

【解决】百度搜索退出不保存的方法,然后重开vimtutor。

2.gdb的n可以一步步运行代码,但是一直提示没有开始运行。

 【解决】是因为之前输入有错,结果重新开始之后就解决了。

原文地址:https://www.cnblogs.com/20135213lhj/p/4841381.html