您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)如何全面分析Fedora GCC程序,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
在向大家詳細(xì)介紹Fedora GCC之前,首先讓大家了解下Linux,然后全面介紹Fedora GCC。
1.命令:[root@localhost ~]# gcc -g http2.c -o http2
得到調(diào)試信息:
[root@localhost ~]# gcc -g http2.c -o http2
http2.c: 在函數(shù) ‘main’ 中:
http2.c:51: 警告:隱式聲明與內(nèi)建函數(shù) ‘bzero’ 不兼容
http2.c:61: 警告:傳遞參數(shù) 2 (屬于 ‘bind’)時(shí)在不兼容的指針類型間轉(zhuǎn)換
http2.c:81: 警告:傳遞參數(shù) 2 (屬于 ‘a(chǎn)ccept’)時(shí)在不兼容的指針類型間轉(zhuǎn)換
http2.c: 在函數(shù) ‘ParseHttpRequest’ 中:
http2.c:153: 警告:隱式聲明與內(nèi)建函數(shù) ‘strstr’ 不兼容
http2.c:153: 警告:隱式聲明與內(nèi)建函數(shù) ‘strlen’ 不兼容
http2.c:158: 警告:隱式聲明與內(nèi)建函數(shù) ‘memset’ 不兼容
http2.c:159: 警告:隱式聲明與內(nèi)建函數(shù) ‘memcpy’ 不兼容
http2.c: 在函數(shù) ‘do_proxy’ 中:
http2.c:315: 警告:隱式聲明與內(nèi)建函數(shù) ‘strcat’ 不兼容
http2.c:316: 警告:隱式聲明與內(nèi)建函數(shù) ‘strlen’ 不兼容
[root@localhost ~]# ./http2正在監(jiān)聽[root@localhost ~]#
2.為了更快速地發(fā)現(xiàn)錯(cuò)誤所在,可以使用GDB進(jìn)行跟蹤調(diào)試,方法如下:
[root@localhost ~]# gdb http2
GNU gdb Red Hat Linux (6.5-15.fc6rh)
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".
當(dāng)GDB提示符出現(xiàn)的時(shí)候,表明GDB已經(jīng)做好準(zhǔn)備進(jìn)行調(diào)試了,現(xiàn)在可以通過run命令讓程序開始在GDB的監(jiān)控下運(yùn)行:Starting program: /root/http2正在監(jiān)聽Program exited normally.
3.下面為搜到的信息,尚未實(shí)驗(yàn)當(dāng)GDB提示符出現(xiàn)的時(shí)候,表明GDB已經(jīng)做好準(zhǔn)備進(jìn)行調(diào)試了,現(xiàn)在可以通過run命令讓程序開始在GDB的監(jiān)控下運(yùn)行:
Starting program: /home/xiaowp/thesis/gcc/code/crash
Input an integer:10
Program received signal SIGSEGV, Segmentation fault.
0x4008576b in _IO_vfscanf_internal () from /lib/libc.so.6
仔細(xì)分析一下GDB給出的輸出結(jié)果不難看出,程序是由于段錯(cuò)誤而導(dǎo)致異常中止的,說明內(nèi)存操作出了問題,具體發(fā)生問題的地方是在調(diào)用
_IO_vfscanf_internal ( )的時(shí)候。為了得到更加有價(jià)值的信息,可以使用GDB提供的回溯跟蹤命令backtrace,執(zhí)行結(jié)果
如下:
#0 0x4008576b in _IO_vfscanf_internal () from /lib/libc.so.6
#1 0xbffff0c0 in ?? ()
#2 0x4008e0ba in scanf () from /lib/libc.so.6
#3 0x08048393 in main () at crash.c:11
#4 0x40042917 in __libc_start_main () from /lib/libc.so.6
跳過輸出結(jié)果中的前面三行,從輸出結(jié)果的第四行中不難看出,GDB已經(jīng)將錯(cuò)誤定位到crash.c中的第11行了。現(xiàn)在仔細(xì)檢查一下:
frame 3 #3 0x08048393 in main () at crash.c:11 11 scanf("%d", input);
使用GDB提供的frame命令可以定位到發(fā)生錯(cuò)誤的代碼段,該命令后面跟著的數(shù)值可以在backtrace命令輸出結(jié)果中的行首找到?,F(xiàn)在已經(jīng)發(fā)現(xiàn)錯(cuò)
誤所在了,應(yīng)該將scanf("%d", input);改為scanf("%d", &input);完成后就可以退出GDB了,命令如下:
GDB的功能遠(yuǎn)遠(yuǎn)不止如此,它還可以單步跟蹤程序、檢查內(nèi)存變量和設(shè)置斷點(diǎn)等。調(diào)試時(shí)可能會(huì)需要用到編譯器產(chǎn)生的中間結(jié)果,這時(shí)可以使用-save-temps選項(xiàng),讓Fedora GCC將預(yù)處理代碼、匯編代碼和目標(biāo)代碼都作為文件保存起來。如果想檢查生成的代碼是否能夠通過手工調(diào)整的辦法來提高執(zhí)行性能,在編譯過程中生成的中間文件將會(huì)很有幫助,具體情況如下:
# Fedora GCC -save-temps foo.c -o foo
# ls foo*
foo foo.c foo.i foo.s
Fedora GCC 支持的其它調(diào)試選項(xiàng)還包括-p和-pg,它們會(huì)將剖析(Profiling)信息加入到最終生成的二進(jìn)制代碼中。剖析信息對(duì)于找出程序的性能瓶頸很有幫助,是協(xié)助Linux Fedora GCC程序員開發(fā)出高性能程序的有力工具。在編譯時(shí)加入-p選項(xiàng)會(huì)在生成的代碼中加入通用剖析工具(Prof)能夠識(shí)別的統(tǒng)計(jì)信息,而- pg選項(xiàng)則生成只有GNU剖析工具(Gprof)才能識(shí)別的統(tǒng)計(jì)信息。
提醒一點(diǎn),雖然Fedora GCC允許在優(yōu)化的同時(shí)加入調(diào)試符號(hào)信息,但優(yōu)化后的代碼對(duì)于調(diào)試本身而言將是一個(gè)很大的挑戰(zhàn)。代碼在經(jīng)過優(yōu)化之后,在源程序中聲明和使用的變量很可能不再使用,控制流也可能會(huì)突然跳轉(zhuǎn)到意外的地方,循環(huán)語句有可能因?yàn)檠h(huán)展開而變得到處都有,所有這些對(duì)調(diào)試來講都將是一場(chǎng)噩夢(mèng)。建議在調(diào)試的時(shí)候***不使用任何優(yōu)化選項(xiàng),只有當(dāng)程序在最終發(fā)行的時(shí)候才考慮對(duì)其進(jìn)行優(yōu)化。
以上就是如何全面分析Fedora GCC程序,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。