gcc
gcc main.c a.c b.c -o main
gcc编译过程,现在是一步到位
编译的步骤:
1. 预处理
处理的是程序中 以 # 开头的行
a.头文件的包含
b.#define 宏定义
c.条件编译
gcc -E main.c -o main.i
=>main.i就是预处理生成的文件2. 编译
把c程序 编译 汇编文件 c=>asm
gcc -S main.i(main.c) -o main.s
把main.i 编译成汇编代码,输出文件名字 main.s3. 汇编
把汇编程序编译成一个目标文件(机器指令文件)
gcc -c main.s(main.c) -o main.o
把一个汇编文件编译成含有机器指令的文件main.o
note:
目标文件虽然是二进制文件 但是不能运行
目标文件由两个部分组成:
代码段:程序的指令,可读 可执行的,一般不可写
数据段:常量,局部变量,静态变量4. 链接
把各个目标文件连接成一个可执行文件
gcc main.o a.o b.o(main.c a.c b.c) -o main
gdb
是单步调试的命令行工具 ,它可以使用你的程序 在你输入命令后,才会运行,而且打印中间变量的值
输入gdb 显示gdb的版本信息
1)
gcc -g main.c -o main
// gcc main.c -o main -g
-g 加入gdb的调试信息
2)调试程序
gdb 可执行的程序
eg:
gdb main
gdb 调试命令
b
breakpoint 用于设置断点
断点?
程序执行到此处 会暂停 等待用户输入指令 才能继续运行
b line_num
设置断点的行
b 函数名
-> 设置函数为一个断点
info b
查看所有的断点
d删除断点
d 断点编号
如果后面不加编号 选择全部断点删除
r
运行代码,直到断点处或程序结束
n
下一步
单步运行
s
下一步
区别:
n把函数调用当成是一步,直接把调用函数执行完
s会进入函数的内部
note:
n s 只有设置了断点 用 r 运行才可以print 变量名
打印变量的值