感谢支持
我们一直在努力

Linux下GCC的DEBUG和优化,以及编译过程

第一:DEBUG实例


[root@localhost debug]# vim null.c


int a(int *p);


 


int main(void)


{


        int* p = 0;


        return a(p);


}


int a(int *p)


{


        int y = *p;


        return y;


}



[root@localhost debug]# ulimit -c unlimited


[root@localhost debug]# gcc -Wall  –g null.c


[root@localhost debug]# ./a.out


Segmentation fault (core dumped)


[root@localhost debug]# ls


null.c  a.out  core.21982 


[root@localhost debug]# yum -y install gdb


[root@localhost debug]# gdb a.out core.21982


……………..


……………..


……………..


(gdb) print p


No symbol table is loaded.  Use the “file” command.


(gdb) print p


$1 = (int *) 0x0


(gdb) backtrace


#0  0x08048389 in a (p=0x0) at null.c:10


#1  0x08048377 in main () at null.c:6


(gdb) quit (gdb)


第二:优化实例(这里主要采用的是-O0—3和no-loops方式)


[root@localhost opm]# cat test.c


#include <stdio.h>


 


double powern(double d, unsigned n)


{


       double x = 1.0;


       unsigned j;


 


       for(j=1;j<n;j++)


              x *=d;


       return x;


}


 


int main(void)


{


       double sum = 0.0;


       unsigned i;


 


       for(i=1;i<=100000000;i++ )


       {


              sum += powern(i,i%5);


       }


       printf(“sum = %g\n”,sum);


       return 0;


}


[root@localhost opm]# gcc -Wall -O0 test.c -o o0  //优化等级为0—不优化


[root@localhost opm]# time ./o0


sum = 5e+30


 


real  0m2.815s


user 0m2.799s


sys   0m0.013s


[root@localhost opm]# gcc -Wall -O1 test.c -o o1  //优化等级为1


[root@localhost opm]# time ./o1


sum = 5e+30


 


real  0m1.849s


user 0m1.843s


sys   0m0.006s


[root@localhost opm]# gcc -Wall -O2 test.c -o o2  //优化等级为2


[root@localhost opm]# time ./o2


sum = 5e+30


 


real  0m1.923s


user 0m1.910s


sys   0m0.011s


[root@localhost opm]# gcc -Wall -O3 test.c -o o3  //优化等级为1


[root@localhost opm]# time ./o3


sum = 5e+30


 


real  0m1.460s


user 0m1.453s


sys   0m0.006s


[root@localhost opm]# gcc -Wall -O3 -funroll-loops  test.c -o o4  //加入no—loop优化


[root@localhost opm]# time ./o4


sum = 5e+30


 


real  0m1.322s


user 0m1.308s


sys   0m0.014s


第三:优化帮助发现DEBUG


[root@localhost O]# vim uninit.c


 


int sign(int x)


{


        int s;


        if (x>0)


                s = 1;


        else if (x<0)


                s = -1;


        return s;


}


[root@localhost O]# gcc -Wall -c uninit.c


[root@localhost O]# gcc -Wall -O1 -c uninit.c


uninit.c: In function ‘sign’:


uninit.c:3: warning: ‘s’ may be used uninitialized in this function


[root@localhost O]# gcc -Wall -O2 -c uninit.c


uninit.c: In function ‘sign’:


uninit.c:3: warning: ‘s’ may be used uninitialized in this function


[root@localhost O]# gcc -Wall -O3 -c uninit.c


uninit.c: In function ‘sign’:


uninit.c:3: warning: ‘s’ may be used uninitialized in this function


编译过程描述实例


[root@localhost hello]# vim hello.c


 


#include <stdio.h>


 


int main(void)


{


        printf(“Hello World!!!\n”);


        return 0;


}


第四:最后列举下编译的过程实例


1、  预处理器阶段(cpp hello.c > hello.i)


[root@localhost hello]# cpp hello.c > hello.i


2、  编译器阶段(gcc -Wall -S hello.i)


[root@localhost hello]# gcc -Wall -S hello.i


3、  汇编器阶段(as hello.s -o hello.o)


[root@localhost hello]# as hello.s -o hello.o


4、  连接器阶段(gcc hello.o)


[root@localhost hello]# gcc hello.o


[root@localhost hello]# ./a.out


Hello World!!!


[root@localhost hello]# file a.out   //检测可执行文件的信息


a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped


[root@localhost hello]# ldd a.out //检查用到的库文件


       linux-gate.so.1 =>  (0x002ab000)


       libc.so.6 => /lib/libc.so.6 (0x00b3a000)


       /lib/ld-linux.so.2 (0x00b17000)


结束

赞(0) 打赏
转载请注明出处:服务器评测 » Linux下GCC的DEBUG和优化,以及编译过程
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏