20145312 《信息安全系统设计基础》第2周学习总结
20145312 《信息安全系统设计基础》第2周学习总结
教材学习内容总结
Vim基本操作
移动光标 :
按Esc进入普通模式,在该模式下使用方向键或者h,j,k,l键可以移动游标。
进入插入模式 :
在普通模式下使用下面的键将进入插入模式,并可以从相应的位置开始输入。
保存文档 :命令行模式下保存文档从普通模式输入:进入命令行模式,输入w回车,保存文档。输入:w 文件名可以将文档另存为其他文件名或存到其它路径下。
退出vim:
命令行模式下退出vim:从普通模式输入:进入命令行模式,输入wq回车,保存并退出编辑。
普通模式下退出vim:普通模式下输入Shift+zz即可保存退出vim
删除文本:
GCC
GNU CC(简称为gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。
1.预处理阶段:一般格式为:gcc [选项] 要编译的文件 [选项] 目标文件 gcc -E hello.c -o hello.i
2.编译阶段:gcc将代码翻译成汇编语言,使用选项-S只进行编译而不进行汇编,结果生成汇编代码。gcc -S hello.i -o hello.s
3.汇编阶段:将.s文件转成目标文件,使用选项-c可以看到汇编代码转换为二进制目标代码。gcc -c hello.s -o hello.o
4.链接阶段:默认搜索链接到libc.so.6函数库当中,调用库文件中已经实现的函数。
GDB
GDB最基本的命令有:
gdb programm(启动GDB)
b 设断点(要会设4种断点:行断点、函数断点、条件断点、临时断点)
run 开始运行程序
bt 打印函数调用堆栈
p 查看变量值
c 从当前断点继续运行到下一个断点
n 单步运行
s 单步运行
quit 退出GDB
GDB的使用
gdb主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数即可。如:
$ gcc -g hello.c -o hello
$ g++ -g hello.cpp -o hello
启动GDB的方法有以下几种:
gdb <program> program也就是执行文件,一般在当前目录下。
gdb <program> core 用gdb同时调试一个运行程序和core文件,core是程序非法执行后,core dump后产生的文件。
gdb <program> <PID> 如果程序是一个服务程序,那么可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试它。program应该在PATH环境变量中搜索得到。
Makefile使用
Makefile的一般写法
test(目标文件): prog.o code.o(依赖文件列表)
tab(至少一个tab的位置) gcc prog.o code.o -o test(命令)
使用带宏的 Makefile
Makefile还可以定义和使用宏(也称做变量),从而使其更加自动化,更加灵活,在Makefile中定义宏的格式为:macroname = macrotext 使用宏的格式为:$(macroname)
生成静态库math.h,共享库math.so
生成静态库:
- 生成目标文件gcc -c add.c sub.c mul.c div.c
- 生成静态库:ar rcs math.a add.o sub.o mul.o div.o
生成共享库
- 生成目标文件:gcc -fpic -c add.c sub.c mul.c div.c
- 生成共享库:gcc -shared -o math.so add.o sub.o mul.o div.o
学习中的问题和解决过程
问题:
如何区分GDB的n(next)命令和s(step)命令,实际使用中应该优先选用哪个?
解答:
GDB的n(next)命令让GDB执行下一行,然后暂停。 s(step)命令的作用与此类似,只是在函数调用时step命令会进入函数。而next导致程序执行的暂停出现在下次调用函数时。DDD有对应的Next和Step菜单项。简单来说next:执行一行源代码但不进入函数内部。step :执行一行源代码而且进入函数内部。我认为应该优选step,通过GDB的next命令一次是移动一行代码,而通过step命令单步调试一段时间,更能够仔细检查靠近断点处的程序状态和行为。