1. 实验记录
任务一:
①、进入文件路径,用第一种方式编译生成可执行文件firstCompile.exe。
②、将三个函数文件编译成.o文件。
③、将三个函数的.o中间文件分别打包生成静态库。
④、使用静态链接库的方式编译生成可执行文件secondCompile.exe。
⑤、将三个函数文件编译打包生成共享库。
⑥、用动态链接库的方式编译生成可执行文件thirdCompile.exe。
任务二:
①、进入调试。
②、查看代码,打断点,单步调试,进入calc函数。
③、打断点,一步一步查看iOut的值。
最终得出iOut的值依次为:0 10 110 1210 13310 146410 1610510 17715610 194871710 2143588810 2104640430
1676208250 由此可见,发生了数据溢出。
任务三:
①、Makefile文件编写。
②、Makefile运行文件测试如下。
2. 思考题回答
1、源代码级别的调试和二进制级别的调试有什么区别?
答:多数源代码使用的语言是高级语言,二进制级别的程序可以理解为一条条的机器指令,一句高级语言翻译成机器指令可能会有很多条。源代码调试的对象是一句句高级语言(多条机器指令的集合)。二进制调试的对象是一句句机器指令,是底层的调试,可以直观知道每个寄存器的数据变化。可以理解为源代码调试没有二进制调试细微化。
3. 实验体会
答:
通过本实验我初步学会了C/C++语言源代码在linux环境下的编译和调试。
编译过程是一个将源代码转换为可执行文件的过程,在这个过程中需要处理各种依赖问题,实验中编译涉及了三种编译操作方式,其总可归于动态编译和静态编译,动态编译是gcc默认的编译方式,静态编译需要用参数强制指定。动态编译的程序占用内存会小一点,而静态编译的程序占用内存会更大。在编译操作中涉及到了makefile的编写,make操作在不指定makefile文件名时,它默认的搜索次序为GNUmakefile、makefile、Makefile,这是一个需要注意的点。在gdb程序实验中使用到了单步调试、打断点等gdb操作,由实验给出的源代码编译的程序经调试发现存在数据溢出的问题。