C语言编译调试相关
2019-09-30 本文已影响0人
csranger
一、编译调试相关
- 编译命令
gcc/clang -g -O2 -o test test.c -I... -L... -l -g 输出的可执行文件中带有调试信息,支持调试 -O2 编译器对输出文件做指令优化使程序执行的更快 -O1表示不做指令优化,一般调试时不做优化 -o test 输出文件是test test.c 是需被编译的源文件 -I 指定头文件,在使用第三方库时如果头文件不在同一目录下告知编译器头文件位置,可以有多个-I -L 指定所引用第三方一堆库文件的位置 -l 指定当前程序具体使用哪个库
- 编译过程
- 预处理:.c文件->.i文件,将头文件所包含的具体内容拷贝过来以及宏替换
- 编译:.i文件->.s文件
- 汇编:.s文件->.o文件
- 链接:.o文件->可执行文件
1. 只预处理命令 cc -o hello.i hello.c -E // 预处理 vi hello.i // 查看只进行预处理后的文件 -E 表示只预处理 2. 预处理+编译+汇编命令 clang -g -c add.c -g 表示输出的可执行文件中带有调试信息,支持调试 -c 表示只预处理+编译+汇编,不输出最终的文件,会得到add.o,此文件不可执行
- 使用libtool将.o文件生成库
1. libtool -static -o libmylib.a add.o -static 表示生成静态库,.a结尾 -o libmylib.a 其中mylib是库名字,前面的lib是规则要求加上的 add.o 是输入文件 2. cc -g -o hello hello.c -I . -L . -l mylib ./hello hello.c 是源文件,里面有#include "add.h" -I . 其中.表示头文件在当前目录下 -L . 其中.表示所引用第三方一堆库文件的位置在当前目录下 -l mylib 表示当前程序具体使用的mylib库
- 这种方式需要 hello.c、add.h、libmylib.a (add.o可删除)
- 一个Makefile文件示例
- 当前目录下6个文件 hello.c min.c max.c min.h max.h Makefile (hello.c 里有#include "min.h" #include "max.h")
# this is Makrfile hello:max.o min.o hello.c # 表示生成hello可执行文件需要max.o min.o hello.c cc -o hello max.o min.o hello.c max.o:max.c cc -c max.c # -c 从预处理到汇编,不链接,会得到max.o min.o:min.c cc -c min.c
- 在当前目录下执行 make 命令会先后自动执行以下3个命令
cc -c min.c cc -c max.c cc -o hello.out max.o min.o hello.c
- 这种方式需要 hello.c、max.h、min.h、max.o、min.o
- 当前目录下6个文件 hello.c min.c max.c min.h max.h Makefile (hello.c 里有#include "min.h" #include "max.h")
- 调试器原理(https://www.cnblogs.com/HKUI/p/8955443.html)
-
linux使用gdb,mac使用lldb
-
编译输出需要带有调试信息
-
常用调试命令gdb/lldb
命令 gdb lldb 设置断点 b b 运行程序 r r 单步执行 n n 跳入函数 s s 跳出函数 finish finish 打印内容 p p -
lldb hello 开始使用lldb调试hello可执行程序
break list 查看当前设置多少断点 quit 退出调试
-