编译工具链
IDE(集或开发环境):visual studio, clion, Eelipse, Xcode
SDK(SOftware Development kit )
- GCC
- GNU
- C
- Compiler
- Clang :(编译快)
预处理
- 作用:执行预处理指令;
#include<stdio.h>
#define N 5
#define SIZE (sizeof(a)/sizeof(a[0]))
宏开关
1.#if #else #endif
- 只执行预处理:
$ gcc -E main.c -o main.i
2.
#ifdef #else #endif
(条件编译)
3.#ifndef #else #endif
(防御式声明,防止头文件被包含多次)
编译-S(扩展)
- 作用:把预处理后的代码翻译成汇编代码
- 基本操作:
push(入栈) mov(移动) call(函数调用) ret(函数返回)
pop(出栈) lea(load effective address) 取地址&
加载有效地址
-
寄存器
-
数据单位
- X86架构:8086
- 数据总线:16bits
- 地址总线:20bits
word:16bits
L:long word 32bits
q:quadra word 64bits
first__double__triple__quadra__penta
总结
- C语言中的变量名对应汇编中的地址
- C语言中的类型对应汇编中的长度
- 函数调用都有自己独立的栈帧,并且参数是值传递
- 循环是通过跳转实现的
汇编(-c)
作用:将汇编代码转换成目标平台的机器代码。
gcc -c main.s -o main
:生成目标文件; ``
链接
作用:为每一个符号(全局变量、函数名)找到相应的定义
$ gcc main.o -o main
总结
- 预处理:
-E
- 编译:
-S
- 汇编:
-c
- 链接:无
-D
定义宏-Wall
显示所有警告- 优化Optmize
-O0
不优化(低)-O1
产品-O2
-O3
(高;最激进的优化级别,一般不使用)
GDB
$ gcc main.c -o main -g
命令
list/l [文件名:] [行号|函数名]
查看源代码run/r
运行程序break/b [文件名:] [行号|函数名]
打断点step /s
单步调试continue /c
继续next /n
逐过程finish
执行完这个函数info break /i b
查看断点信息delete /d [编号]
删除所有断点或删除n号断点ignore [n] [count]
忽略 n号断点 count 次
监视
print /p 表达式
display 表达式
info display
undisplay [n]
删除所有监视点、删除 n号监视点
查看内存(了解)
GDB查看core黑匣子
“黑匣子”:——core文件 (将程序崩溃瞬间栈的内容保存下来)
# sudo echo "core"> /proc/sys/kernel/cor_pattern
需要切换成root权限