20145216史婧瑶 《信息安全系统设计基础》第2周学习总结
教材学习内容总结
一、VIM
1、hjkl所表示的即为光标 ←↓↑→,前提是要在normal的状态下。方便记忆j像一个笔就像下箭头。
·i → Insert 模式,可插入文本。按 ESC 回到 Normal 模式.
·A → 输入欲添加文本(在一行后添加文本)。按 ESC 回到 Normal 模式.
·x → 删当前光标所在的一个字符。
·:wq → 存盘 + 退出 (:w 存盘, :q 退出)
2、删除类命令:
该命令为操作符d+删除格式
·dw可以从光标处删除至一个单词的末尾(normal模式下)
·d$从当前光标删除到行末
·de删除从当前光标位置直至单词末尾,不包括最后一个字符
·d number motion 可重复执行该操作(例如d2w指删除前两个单词)
·number(行个数) dd 删除x行
·撤销 u ;撤销撤销 Ctrl + R
·光标移动至行首0
3、输入p可以粘贴之前删除掉的内容
·输入r和一个字符可以替换当前光标所在的位置的字符
·输入cw和几个字符可以替换当前光标所在的位置的字符直至该字母结束的字符
·d number motion 替换文本
4、打开/保存/退出/改变文件(Buffer)
·:e → 打开一个文件
·:w → 存盘
·:saveas → 另存为
·:x, ZZ 或 :wq → 保存并退出 (:x 表示仅在需要时保存,ZZ不需要输入冒号并回车)
·:q! → 退出不保存 :qa! 强行退出所有的正在编辑的文件,就算别的文件有更改。
·:bn 和 :bp → 你可以同时打开很多文件,使用这两个命令来切换下一个或上一个文件。(陈皓注:我喜欢使用:n到下一个文件)
5、效率
·NG → 到第 N 行
·gg → 到第一行
·G → 到最后一行
·y → 从这里开始拷贝
·$ → 拷贝到本行最后一个字符
·v (可视化的选择)
·gU (变大写)
·gu (变小写)
·^ → 到本行的第一个非blank字符
·$ → 到行尾
·g_ → 到本行最后一个不是blank字符的位置。
·fa → 到下一个为a的字符处,你也可以fs到下一个为s的字符。
·t, → 到逗号前的第一个字符。逗号可以变成其它字符。
·3fa → 在当前行查找第三个出现的a。
·F 和 T → 和 f 和 t 一样,只不过是相反方向。
二、GCC
GCC相关概念:GNU CC(简称为gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。
gcc编译程序的流程
1.gcc -E hello.c -o hello.i
2.gcc -S hello.i -o hello.s
3.gcc -C hello.o -o hello.o
4.gcc hello.o -o hello
首先gcc会调用预处理程序cpp,由它负责展开在源程序中定义的宏(上例:#include <stdio.h>),向其中插入#include语句所包含的内容(原地展开stdio.h包含的代码)
第二步,将hello.i编译为目标代码,gcc默认将.i文件看成是预处理后的C语言源代码,因此它会直接跳过预处理,开始编译过程。
第三步,gcc连接器将目标文件链接为一个可执行文件,一个大致的编译流程结束。
三、GDB
GDB相关概念:GDB, 是 The GNU Project Debugger 的缩写, 是 Linux 下功能全面的调试工具。GDB 支持断点、单步执行、打印变量、观察变量、查看寄存器、查看堆栈等调试手段。在 Linux 环境软件开发中,GDB 是主要的调试工具,用来调试 C 和 C++ 程序。
如果要调试程序,需要在 gcc 编译可执行程序时加上 -g 参数,首先我们编译 bugging.c 程序,生成可执行文件:
1.gcc -g -o bugging bugging.c -m32
其中-o
指定输出文件名, -m32 表示构建32位可执行程序,实验楼的环境是 64 位的 Ubuntu 14.04,所以默认会编译为 64 位的程序。
2.输入 gdb bugging
进入 gdb 调试 bugging 程序的界面:
3.gdb bugging
在 gdb 命令行界面,输入run 执行待调试程序:
4.(gdb) run
在 gdb 命令行界面,输入quit 退出 gdb:
5.(gdb) quit
命令行界面使用技巧:
GDB命令补全
任何时候都可以使用 TAB 进行补全,如果只有一个待选选项则直接补全;否则会列出可选选项,继续键入命令,同时结合 TAB 即可快速输入命令。
部分 gdb 常用命令一览表
命令 简写形式 说明
list l 查看源码
backtrace bt、where 打印函数栈信息
next n 执行下一行
step s 一次执行一行,遇到函数会进入
finish 运行到函数结束
continue c 继续运行
break b 设置断点
info breakpoints 显示断点信息
delete d 删除断点
print p 打印表达式的值
run r 启动程序
until u 执行到指定行
info i 显示信息
help h 帮助信息
GDB查询用法
在 gdb 命令行界面,使用 (gdb) help command
可以查看命令的用法
执行 Shell 命令
在 gdb 命令行界面可以执行外部的 Shell 命令:
(gdb) !shell
命令
例如查看当前目录的文件:
(gdb) !ls
(查看当前目录文件)
GDB 断点
重新进入 debugging 调试界面
gdb bugging
查看源码
list
命令用来显示源文件中的代码
通过行号查看源码
list 行号,显示某一行附近的代码
list 文件名 : 行号,显示某一个文件某一行附近的代码,用于多个源文件的情况。
list 函数名,显示某个函数附近的代码
list 文件名 : 函数名,显示某一个文件某个函数附近的代码,用于多个源文件的情况。
设置断点
break
命令用来设置断点
通过行号设置断点
break 行号,断点设置在该行开始处,注意:该行代码未被执行。
break 文件名 : 行号,适用于有多个源文件的情况。
通过函数设置断点
break 函数名,断点设置在该函数的开始处,断点所在行未被执行。
break 文件名 : 函数名,适用于有多个源文件的情况。
四、makefile基本规则
makefile的好处就是当一个程序有多个文件时,每个文件的改变都会导致所有文件的重新编译,使用makefile能够记录文件的信息,决定什么时候重新编译链接。
1、Makefile文件规则:
·一个目标,即make最终需要创建的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如‘clean’
·一个或多个依赖文件的列表,通常是编译目标文件所需要的其他文件。 之后的一系列命令,是make执行的动作,通常是把指定的相关文件编译成目标文件的编译命令, 每个命
占一行,并以tab开头(初学者务必注意:是tab,而不是空格) 执行以上Makefile后就会自动化编译。
2、Makefile的一般写法:
·test(目标文件): prog.o code.o(依赖文件列表)
·tab(至少一个tab的位置) gcc prog.o code.o -o test(命令)
3、Makefile还可以定义和使用宏(也称做变量):
·定义宏的格式为:macroname = macrotext
·使用宏的格式为:$(macroname)
教材学习中的问题和解决过程
问题:GDB的n(next)命令让GDB执行下一行,然后暂停。 s(step)命令的作用与此类似,只是在函数调用时step命令会进入函数,那么实际使用中应该优先选用哪个?为什么?
解决方法:next:简记为 n,单步跟踪程序,当遇到函数调用时,也不进入此函数体;
step:遇到用户自定义的函数,将步进到函数中去运行,而 next 则直接调用函数,不会进入到函数体内。
Step命令,如果step命令将要运行的源代码行上有函数调用,那么step命令将导致GDB进入到被调用函数的内部。通常把step称为步入命令。
代码调试中的问题和解决过程
问题:进行GDB调试时,出现错误:
解决方法:由于生成的二进制可执行文件没有使用-g选项,
gcc中-g选项是为了获得有关调试信息,要用gdb进行调试,必须使用-g生成二进制可执行文件。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 3000行 | 30篇 | 300小时 | |
第一周 | 0/0 | 1/2 | 25/40 | 学习了Linux基础知识和核心命令 |
第二周 | 0/0 | 0/2 | 0/40 | |
第三周 | 300/300 | 3/5 | 40/80 |
学习了vim、gcc、gdb指令; 学习了信息表示和处理 |
参考资料
- 《深入理解计算机系统V2》学习指导
- Vim编辑器
- GDB 简明教程
- Linxu系统编程:实验2、3、4