gcc debug
gcc -g
cat -n null.c // -n 列出行号
int a(int *p); int main(void) { int* p = 0; //0是内核地址 return a(p); } int a(int *p) { int y = *p; //访问内核地址,不允许 return y; }
--进行debug
gcc -Wall -g null.c
//编译语法没有错误
./a.out
ulimit -c
ulimit -c unlimited //允许产生core dumped
man ulimit
./a.out
ll
gdb a.out core.6363
//查看详细信息
print p
backtrace
cat -n null.c
--优化
debug,不优化
-o0
生产:
-o2
vi test.c
#include<stdio.h> double powern(double d,unsigned n) { double x = 1.0; unsigned j = 1; for(;j<=n;j++) { x *= d; } return x; } int main(void) { double sum = 0.0; unsigned i=1; for(;i<=100000000;i++) { sum += powern(i,i%5); } printf("sum = %g.\n",sum); return 0; }
不优化
gcc -Wall -o0 test.c -o test
time ./test //查看指向时间
o1优化
gcc -Wall -o1 test.c -o test01
time ./test01 //查看指向时间
o2优化
gcc -Wall -o2 test.c -o test02
time ./test02 //查看指向时间
o3优化
gcc -Wall -o3 test.c -o test03
time ./test03 //查看指向时间
对循环进行优化
gcc -Wall -o3 -funroll-loops test.c -o test04
time ./test04 //查看指向时间
vi uninit.c
int sign(int x) { int s; if(x>0) s = 1; else if(x<0) s = -1; return s; }
//s没有初始化,存在漏洞,-o1 才可以检查出来
gcc -Wall -o1 -c uninit.c
--经典优化
for(i=0;i<n;i++) { y[i]=i; }
优化后:
for(i=0;i<(n%2);i++) { y[i]=i; } for(;i+1<n;i+=2) { y[i] = i; y[i+1] = i+1; }
减少循环判断次数
--编译c++
g++
which g++:g++编译c++
which gcc: gcc编译c
vi hello.cc
#include<iostream> int main() { std::cout<<"Hello,world!"<<std::endl; return 0; }
g++ -Wall hello.c -o hello
//只编译
g++ -Wall -c hello.cc
//连接
g++ hello.o -o hello
--编译器是怎么工作的?
四个步骤:
1.预处理
2.编译
3.汇编
4.链接
vi hello.c
#include<stdio.h> int main(void) { printf("Hello,world!\n"); return 0; }
gcc -Wall hello.c -o hello
分解步骤:
1.预处理
cpp hello.c > hello.i
cat hello.i | more
2.编译成汇编语言
gcc -Wall -S hello.i
cat hello.s
3.汇编产生目标文件
as hello.s -o hello.o
4.链接
gcc hello.o -o hello
--gcc辅助工具
1. file
file hello
file hello.c
ELF:可执行文件
LSB:编译平台
2.ldd:查看依赖的动态库
--gcc优化工具
1.gprof:查看每个函数的执行时间和调用次数
gcc -Wall -pg hello.c -o hello
gprof hello
2.gcov:统计程序每行的执行时间
vi cov.c
#include<stdio.h> int main(void) { int i; for(i=1;i<10;i++) { if(i%3 == 0) printf("%d is divisible by 3.\n",i); if(i%11 == 0) printf("%d is divisible by 11.\n",i); } }
gcc -Wall -fprofile-arcs -ftest-coverage cov.c -o cov
./cov
gcov cov.c
grep "#####" *.gcov