3--编译和执行过程
- 1.编译
- 2.gdb调试
- gdb 查core
GCC是一个编译套件,是一个以"gcc"命令为首的源码施工队。施工队的成员有gcc、cpp、as、ld四个成员
- 预处理–宏定义展开,头文件引入-- cpp 等价于 gcc -E
- 编译–C语言->汇编语言–gcc -S
- 汇编–汇编语言->机器语言–gcc -c
- 链接–链接相关的.o文件–ld
-o 指定输出文件的名字
1.编译
(win操纵系统,老九课堂笔记)
1.预处理–将头文件(.h)的具体内容展开至源文件中;删除注释;添加行号和文件标识等;预处理完产生一个.ii文件(c语言编译将产生一个.i文件)
cpp demo.cpp > demo.ii
cpp 为 C Preprocessor的缩写, >表示输出到文件
还有另外两种命令也可以用于产生.ii 文件,其中-o参数用于指定输出文件命
g++ -o demo.ii -E demo.cpp
g++ -o demo.ii demo.cpp
2.编译–对.ii文件进行词法/语法/语义分析,生成相应的汇编文件,.s文件
g++ -o demo.s -S demo.ii
3.汇编–将汇编文件转换成二进制目标文件.o .obj结尾
as -o demo.o demo.s
g++同样可以实现
g++ -o demo.o demo.s
4.连接–将目标文件和C++库函数连接,将涉及到的库代码合并到目标代码中;
g++ -o demo.exe demo.o
生成demo.exe可执行文件
(mac+vscode)
在vscode 终端上输入
g++ main.cpp -o main
"/Users/chenyingying/CppProject/Helloworld/"main
即可运行,(猜测)第一条语句是不是包括了预处理,编译,汇编,连接于一体,生成mac/linux下可执行文件main.out文件。输入目录运行对应的可执行文件。
2.gdb调试
GNU debugger–Richard Stallman设计的
要想通过gdb调试,必须在编译时加上调试接口,即-g
gcc -g ./rubbish.c input.c readfile.c -o rubbish19_debug
gdb ./rubbish19_debug
GDB 的一些常用指令:
- run/r–进入调试状态后,运行代码
- break/b–设置断点break 12 # 在源码12行设置断点
- list/l–显示源代码
- continue/c–继续执行直至下一个端点或者结束
- print/p–打印变量的值
- examine/x–查看指定内存地址中的数据,(只能查看当前被调试程序能够非法访问的地址)
- next/n–单步执行命令。
MAC上使用gdb(完美解决)
(证书没有添加成功,sudo应该可以跑)
gdb 查core
sudo service apport stop # 关掉某些服务ulimit -c unlimited # 启动某些东西xxxbuild_run app1_test # 编译运行某个文件,产生core文件 vcat /proc/sys/kernel/core_pattern # 查看core文件生成的路径cd xxx/test # cd core 文件目录gdb app1_test core # gdb 调试出core文件bt # 跳转到出core的地方