1. C语言程序执行过程
- C语言程序运行需要4个步骤:预处理、编译、汇编、链接。
- 预处理: gcc -E file.c
宏定义 2.文件包含 3.条件编译 这些功能分别用宏定义命令、文件包含命 令、条件编译命令来实现。
- 编译:
检查代码的规范性、是否有语法错误等。生成.i文件,是与处理过的C原始程序。 无误后生成汇编语言。
- 汇编:
叫汇编,但是把汇编文件生成目标文件【机器语言,也就是二进制文件】。
- 链接:.o的目标对象不是可执行的,还需要把所需要的其它目标对象链接在一起。让程序找到调用的函数,对汇编指令进行符号解析、符号重定位等工作,一个可执行文件需要多个目标对象链接在一起才能生成。
这一阶段最后生成可执行文件或库文件。
- 这一过程涉及静态库【如windows下一些dll文件缺失】和动态库,静态库主要在符号重定位阶段,把库中有关代码拷贝进来。而动态库涉及一些调用别人实现的库的函数,不是在自己程序中实现的。此外,静态库在重定位阶段,而动态库链接是在可执行文件装载到内存时,根据依赖关系进行重定位。
- 总之这一阶段,代码一直在库和自己的程序中做跳转。
观察如下编译过程:
有的链接到了/lib/.so中,而有的链接到了本地/.o目标对象中,这就是动态库和静态库,链接去了两个不同地方。比如printf肯定链接到动态库,而自己写的函数肯定链接到本地文件夹下的.o目标对象。
- 动态库和静态库区别:
静态库直接把代码拷贝进来,而动态库只有运行时才把库文件中代码加载到可执行文件中。简言之动态库运行时加载,静态库直接拷贝。后者先于前者,且生成可执行文件后,动态库才加载。
2. gcc
记住:ESC
-E:只激活预处理。生成.i文件。
-S:生成汇编语言。.生成S文件。
-C:把汇编生成机器语言,即目标文件, 生成.O文件。
-O:之前这些选项过程,都可以加-O,生成临时文件,直接gcc会一次性做4个步骤生成可执行文件。
- g:生成可调试的代码文件,gdb需要这个。
gcc test.c -o test生成的test默认是release程序,不可以调试
gcc test.c -o test_debug -g可以生成的test_debug可以调试。
3.Linux下调试器:gdb
- 使用过程:
-
vim写个简单程序:
【经过 gcc编译 才能进入gdb,且这里要加-std=c99】
-o 是生成中间文件,-g是生成可debug的文件。
gcc mytest.c -o mytest -g -std=c99 -
gdb进入调试器:gdb mytest进入gdb调试。
- list或l查看代码【显示的默认行数会根据可修改的默认设定】
- 通过r运行:无BUG就显示:exited normally
- list或l查看代码【显示的默认行数会根据可修改的默认设定】
-
b或break line:加断点,再用info b查断点
info b 还会查看到集中了几次这个断点。 -
step或s:继续执行,F11逐语句
-
next或n:相当于F10逐过程
-
监视变量值:display
会常自动显示出来某个变量。
之后按S或N会自动显示这些变量。
-
关闭监视:undisplay ,undisplay 变量名不可以
undisplay 行号,之后行4的i变量,就不会再在执行中显示了。 -
结束当前函数:finish
-
continue或c:直接到达下一个断点。
-
until +line:直接把结果运行到某一行。很好用
-
d 断点编号 删断点
-
disable 断点编号 暂时关闭
yum
yum - upgrade:升级所有包,不升级软件和系统内核。
yum - update:升级所有包同时也升级软件和系统内核。