• 信息安全系统设计基础第二周学习总结(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可以一步步运行代码,但是一直提示没有开始运行。

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

  • 相关阅读:
    Oracle解除死锁
    观察者模式
    观察者模式
    第一个go程序
    第一个go程序
    Jersey处理表单Post信息
    Jersey处理表单Post信息
    JS获取操作系统及浏览器信息
    JS获取操作系统及浏览器信息
    Linux常用命令
  • 原文地址:https://www.cnblogs.com/20135213lhj/p/4841381.html
Copyright © 2020-2023  润新知