您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關如何全面分析Fedora GCC程序,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
在向大家詳細介紹Fedora GCC之前,首先讓大家了解下Linux,然后全面介紹Fedora GCC。
1.命令:[root@localhost ~]# gcc -g http2.c -o http2
得到調試信息:
[root@localhost ~]# gcc -g http2.c -o http2
http2.c: 在函數 ‘main’ 中:
http2.c:51: 警告:隱式聲明與內建函數 ‘bzero’ 不兼容
http2.c:61: 警告:傳遞參數 2 (屬于 ‘bind’)時在不兼容的指針類型間轉換
http2.c:81: 警告:傳遞參數 2 (屬于 ‘accept’)時在不兼容的指針類型間轉換
http2.c: 在函數 ‘ParseHttpRequest’ 中:
http2.c:153: 警告:隱式聲明與內建函數 ‘strstr’ 不兼容
http2.c:153: 警告:隱式聲明與內建函數 ‘strlen’ 不兼容
http2.c:158: 警告:隱式聲明與內建函數 ‘memset’ 不兼容
http2.c:159: 警告:隱式聲明與內建函數 ‘memcpy’ 不兼容
http2.c: 在函數 ‘do_proxy’ 中:
http2.c:315: 警告:隱式聲明與內建函數 ‘strcat’ 不兼容
http2.c:316: 警告:隱式聲明與內建函數 ‘strlen’ 不兼容
[root@localhost ~]# ./http2正在監聽[root@localhost ~]#
2.為了更快速地發現錯誤所在,可以使用GDB進行跟蹤調試,方法如下:
[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".
當GDB提示符出現的時候,表明GDB已經做好準備進行調試了,現在可以通過run命令讓程序開始在GDB的監控下運行:Starting program: /root/http2正在監聽Program exited normally.
3.下面為搜到的信息,尚未實驗當GDB提示符出現的時候,表明GDB已經做好準備進行調試了,現在可以通過run命令讓程序開始在GDB的監控下運行:
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
仔細分析一下GDB給出的輸出結果不難看出,程序是由于段錯誤而導致異常中止的,說明內存操作出了問題,具體發生問題的地方是在調用
_IO_vfscanf_internal ( )的時候。為了得到更加有價值的信息,可以使用GDB提供的回溯跟蹤命令backtrace,執行結果
如下:
#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
跳過輸出結果中的前面三行,從輸出結果的第四行中不難看出,GDB已經將錯誤定位到crash.c中的第11行了。現在仔細檢查一下:
frame 3 #3 0x08048393 in main () at crash.c:11 11 scanf("%d", input);
使用GDB提供的frame命令可以定位到發生錯誤的代碼段,該命令后面跟著的數值可以在backtrace命令輸出結果中的行首找到。現在已經發現錯
誤所在了,應該將scanf("%d", input);改為scanf("%d", &input);完成后就可以退出GDB了,命令如下:
GDB的功能遠遠不止如此,它還可以單步跟蹤程序、檢查內存變量和設置斷點等。調試時可能會需要用到編譯器產生的中間結果,這時可以使用-save-temps選項,讓Fedora GCC將預處理代碼、匯編代碼和目標代碼都作為文件保存起來。如果想檢查生成的代碼是否能夠通過手工調整的辦法來提高執行性能,在編譯過程中生成的中間文件將會很有幫助,具體情況如下:
# Fedora GCC -save-temps foo.c -o foo
# ls foo*
foo foo.c foo.i foo.s
Fedora GCC 支持的其它調試選項還包括-p和-pg,它們會將剖析(Profiling)信息加入到最終生成的二進制代碼中。剖析信息對于找出程序的性能瓶頸很有幫助,是協助Linux Fedora GCC程序員開發出高性能程序的有力工具。在編譯時加入-p選項會在生成的代碼中加入通用剖析工具(Prof)能夠識別的統計信息,而- pg選項則生成只有GNU剖析工具(Gprof)才能識別的統計信息。
提醒一點,雖然Fedora GCC允許在優化的同時加入調試符號信息,但優化后的代碼對于調試本身而言將是一個很大的挑戰。代碼在經過優化之后,在源程序中聲明和使用的變量很可能不再使用,控制流也可能會突然跳轉到意外的地方,循環語句有可能因為循環展開而變得到處都有,所有這些對調試來講都將是一場噩夢。建議在調試的時候***不使用任何優化選項,只有當程序在最終發行的時候才考慮對其進行優化。
以上就是如何全面分析Fedora GCC程序,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。