20145212 《信息安全系统设计基础》第2周学习总结
教材学习内容总结
Vim基本操作
- 1.使用vim命令进入vim界面
vim后面加上你要打开的已存在的文件名或者不存在(则作为新建文件)的文件名。 打开Xfce终端,输入以下命令
$ vim practice_1.txt
直接使用vim也可以打开vim编辑器,但是不会打开任何文件。
$ vim
进入命令行模式后输入:e 文件路径 同样可以打开相应文件。
- 2.游标移动
按Esc进入普通模式,在该模式下使用方向键或者h,j,k,l键可以移动游标
按键 | 说明 |
---|---|
h | 左 |
l | 右 |
j | 下 |
k | 上 |
w | 移动到下一个单词 |
b | 移动到上一个单词 |
- 3.进入插入模式
在普通模式下使用下面的键将进入插入模式,并可以从相应的位置开始输入
命令 | 说明 |
---|---|
i | 在当前光标处进行编辑 |
I | 在行首插入 |
A | 在行末插入 |
a | 在光标后插入编辑 |
o | 在当前行后插入一个新行 |
O | 在当前行前插入一个新行 |
cw | 替换从光标所在位置后到一个单词结尾的字符 |
注意每次要先回到普通模式才能切换成以不同的方式进入插入模式
- 4.保存文档
命令行模式下保存文档
从普通模式输入:进入命令行模式,输入w回车,保存文档。输入:w 文件名可以将文档另存为其他文件名或存到其它路径下
- 5.退出vim
1.命令行模式下退出vim
从普通模式输入:进入命令行模式,输入wq回车,保存并退出编辑
2.以下为其它几种退出方式:
命令 | 说明 |
---|---|
:q! | 强制退出,不保存 |
:q | 退出 |
:wq! | 强制保存并退出 |
:w <文件路径> | 另存为 |
:saveas 文件路径 | 另存为 |
:x | 保存并退出 |
:wq | 保存并退出 |
3.普通模式下退出vim
普通模式下输入Shift+zz即可保存退出vim
- 6、删除文本
1.普通模式下删除vim文本信息
进入普通模式,使用下列命令可以进行文本快速删除:
命令 | 说明 |
---|---|
x | 删除游标所在的字符 |
X | 删除游标所在前一个字符 |
Delete | 同x |
dd | 删除整行 |
dw | 删除一个单词(不适用中文) |
d$或D | 删除至行尾 |
d^ | 删除至行首 |
dG | 删除到文档结尾处 |
d1G | 删至文档首部 |
除此之外,还可以在命令之前加上数字,表示一次删除多行,如:
2dd
表示一次删除2行
GCC基本操作
- 预处理:gcc –E hello.c –o hello.i;gcc –E调用cpp
- 编 译:gcc –S hello.i –o hello.s;gcc –S调用ccl
- 汇 编:gcc –c hello.s –o hello.o;gcc -c 调用as
- 链 接:gcc hello.o –o hello ;gcc -o 调用ld
Tips:
1.Linux的可执行文件并没有像 Windows 那样有明显的.exe后缀名, 只需向其分配x(可执行)权限即可 sudo chmod u+x excutefile
2.作为Linux程序员,我们可以让gcc在编译的任何阶段结束,以便检查或使用该阶段的输出(这个很重要)
GDB基本操作
- 建议使用CGDB,比GDB好用,熟悉VC的调试方式,可以使用DDD。
- 注意使用GCC编译时要加“-g”参数。 参考gdb参考卡GDB最基本的命令有:
0.gdb programm(启动GDB)
1.l 列出源码,相当于list
2.b 设断点(要会设4种断点:行断点、函数断点、条件断点、临时断点)
3.run 开始运行程序
4.bt 打印函数调用堆栈
5.p 查看变量值
6.c 从当前断点继续运行到下一个断点
7.n 单步运行
8.s 单步运行
9.quit 退出GDB
- 注:启动gdb的方法有以下几种:
gdb <program> program
也就是执行文件,一般在当前目录下。
gdb <program> core
用gdb同时调试一个运行程序和core文件,core是程序非法执行后,core dump后产生的文件。
gdb <program> <PID>
如果程序是一个服务程序,那么可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试它。program应该在PATH环境变量中搜索得到。 gdb启动时,可以加上一些gdb的启动开关,详细的开关可以用gdb -help查看。下面只列举一些比较常用的参数:-symbols <file> -s <file>
从指定文件中读取符号表。-se file
从指定文件中读取符号表信息,并把它用在可执行文件中。-core <file> -c <file>
调试时core dump的core文件。-directory <directory> -d <directory>
加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。
截图:
Makefile的使用
使用参考了实验楼的教程,就不在此复制粘贴了……
教材学习中的问题和解决过程
- 问题一:GDB的n(next)命令让GDB执行下一行,然后暂停。 s(step)命令的作用与此类似,只是在函数调用时step命令会进入函数,那么实际使用中应该优先选用哪个?为什么?
GDB的next命令让GDB执行下一行,然后暂停。step命令的作用于此类似,只是在函数调用时step命令会进入函数,而next导致程序执行的暂停出现在下次调用函数时。DDD有对应的Next和Step菜单项。
答:
next:执行一行源代码但不进入函数内部。
step :执行一行源代码而且进入函数内部。
我认为应该优选step,通过GDB的next命令一次是移动一行代码,而通过step命令单步调试一段时间,更能够仔细检查靠近断点处的程序状态和行为。
代码调试中的问题和解决过程
- 1.在进行实验楼实验的学习中,代码编译出现一个错误:
- 2.经过对div.c的检查,删除了一个不小心打上的~号之后,成功
- 3.但是运行的结果中div一直是0,经过思考,应该是由于div.c中的a和b都是int型的,要想进行double运算需要一个类型转换所导致。
- 4.但是,不论是强制类型转换还是在div.c中变成return (a+0.0)/b,得到的结果依旧都是0.0000……
- 5.我尝试在Windows的VC++中编译了相同的程序,得到的结果却是正确的!!!
- 6.陷入沉思……并不知道为什么?难道是因为不同系统的规定不一样……?
- 7.把上述代码中除了main函数外的代码制作成一个静态库math.a和一个共享库math.so
- 8.编写makefile,让代码编译,上述静态库和共享库的使用自动化。
课程学习中的问题和解决过程
- 一、在vim下载过程中出现以下问题
E: 无法获得锁 /var/cache/apt/archives/lock – open (11 资源临时不可用)
E: 无法锁定下载目录
解决方法:
命令:ps -aux
列出进程
找到最后一列以apt-get 开头的进程
命令:sudo kill 该进程的PID```
```方法二:
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock```
- 二、在Ubuntu下使用git上传代码:
1.首先,我按照在百度上找到的教程生成公钥:
![](http://images2015.cnblogs.com/blog/877181/201609/877181-20160924095810996-1792492929.png)
![](http://images2015.cnblogs.com/blog/877181/201609/877181-20160924100003309-703529246.png)
2.然而,在添加过公钥进行链接测试的时候出现了问题:
![](http://images2015.cnblogs.com/blog/877181/201609/877181-20160924100101043-343268280.png)
无法连接……这个问题各种查资料……重新生成公钥等等摆弄了半天都没有成功,然而最后惊觉我使用的是开源中国而不是github……咳……
3.接下来进行正确的git连接,还是出现了问题:
![](http://images2015.cnblogs.com/blog/877181/201609/877181-20160924100425309-761557426.png)
```经过百度,在一个全英文的网页上看到了奇怪的解决方法:```
![](http://images2015.cnblogs.com/blog/877181/201609/877181-20160924100633465-1289475584.png)
4.最终连接成功:
![](http://images2015.cnblogs.com/blog/877181/201609/877181-20160924095915887-879683529.png)
5.推送(一部分代码):
![](http://images2015.cnblogs.com/blog/877181/201609/877181-20160924114628106-1220607168.png)
## 家庭作业中的问题和解决过程
- 7.7 不改变任何变量名字,修改7.6.1中的bar5.c,使得fool5.c输出x和y的正确值
答:输出错误的原因是全局符号x被多重定义,若想输出正确的值,可以将bar5.c中的x变成局部变量,将其移到void f()的括号中就可以了。
- 7.8
答:
A.main.1,main.2;
B.UNKNOWN;
C.ERROR.
- 7.9 的程序当在Linux系统中编译和执行时,即使p2不初始化变量main,它也能打印字符串“0x55
”并正常终止。你能解释这一点吗?
答:p2中的main是弱符号,链接器会把bar6.c中的main引用为foo6.c中的main,打印出来的应该是main函数指令第一个字节的地址。
- 7.10 给出使得静态链接器能够解析所有符号引用的最小的命令行:
答:
A.gcc p.o libx.a p.o
B.gcc p.o libx.a liby.a libx.a
C.gcc p.o liby.a libx.a liby.a libz.a
## 本周代码托管截图
![](http://images2015.cnblogs.com/blog/877181/201609/877181-20160925170522022-515779163.png)
![](http://images2015.cnblogs.com/blog/877181/201609/877181-20160925170607744-1426318590.png)
![](http://images2015.cnblogs.com/blog/877181/201609/877181-20160925170413939-1340810196.png)
![](http://images2015.cnblogs.com/blog/877181/201609/877181-20160925170425361-1248391061.png)
![](http://images2015.cnblogs.com/blog/877181/201609/877181-20160925170432362-262576827.png)
## 其他
感觉这周要学习的内容好多啊,不过更多的是学习一些在Ubuntu下的Vim基本操作以及一些很基础的原理。
这周即使按照课本以及实验楼的实验过了一遍还是觉得在实际用起来的时候很生疏,希望以后的学习中可以不断巩固。
## 学习进度条
| | 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)|重要成长|
| -------- | :----------------:|:----------------:|:---------------: |:-----:|
| 第一周 | 0/0 | 2/2 | 10/10 | |
| 第二周 | 300/300 | 3/3 | 20/30 | |
## 参考资料
- [Makefile使用 - 实验楼](https://www.shiyanlou.com/courses/running)
- [《深入理解计算机系统V2》学习指导](http://www.cnblogs.com/rocedu/p/5826467.html)
- [GDB调试](http://blog.chinaunix.net/uid-20788636-id-1841301.html)
- [简明Vim练级攻略](http://coolshell.cn/articles/5426.html)
- [Linux makefile 教程 非常详细,且易懂](http://coolshell.cn/articles/5426.html)
- [Linux系统编程 实验楼](https://www.shiyanlou.com/courses/24)