1. 程式人生 > >【Linux學習筆記八】Linux程式設計-編譯(gcc)與除錯(gdb)

【Linux學習筆記八】Linux程式設計-編譯(gcc)與除錯(gdb)

【注】文章中的所有截圖均為centos下實驗結果,親測命令正確= ̄ω ̄=

【參考資料】《Linux從入門到精通(第2版)》劉憶智 等編著

1、編譯一個C程式:以用vim寫成的summary.c為例
     $ gcc summary.c ##編譯檔案,生成名為 a.out 的可執行檔案
     $ ./a.out ##執行檔案      gcc -o sum summary.c ##為編譯生成的可執行檔案命名為sum      $ ./sum ##為編譯生成的可執行檔案命名為sum
2、同編譯有關的選項
選項 功能
-c 只啟用預處理、編譯和彙編,生成副檔名為.o的目的碼檔案(編寫大型程式所必須)
-S 只啟用預處理和編譯,生成副檔名.s的彙編程式碼檔案
-E 只啟用預處理,並將結果輸出至標準輸出
-g 為除錯程式(如gdb)生成相關資訊
     $ gcc -E summary.c > pre_sum ##將結果重定向輸出到檔案中 3、編譯C++程式:g++      $ g++ -o hello hello.cpp ##與gcc用法基本一致 4、啟動除錯(gdb)      $ gcc -g summary.c ##在除錯之前,必須先用gcc -g命令生成帶有除錯資訊的可執行程式      $ gdb a.out ##對二進位制檔案a.out進行除錯
,提示符(gdb)等待接受使用者的指令

5、獲得幫助:gdb支援<Tab>的命令補全,和兩個<Tab>的命令列表(前邊提到過Shell的同樣功能),也支援縮寫,如help可以用h代替      (gdb) help ##顯示gdb的幫助資訊      (gdb) help breakpoints ##進一步獲取和斷點有關的幫助資訊
6、檢視原始碼      (gdb) list ##檢視程式原始碼,每次顯示十行,回車繼續顯示,list可以簡寫成 l      (gdb) l 15 ##顯示第 15 行附近的 10 行程式碼      (gdb) search int summary
 ##查詢對應內容,回車繼續查詢下一個(朝向檔案尾)
     (gdb) reverse-search Summary ##向相反方向搜尋(朝向檔案頭)      search和reverse-search支援使用正則表示式搜尋。



7、設定斷點      (gdb) break 10 ##在第10行設定斷點      (gdb) break summary ##在summary()函式入口處設定斷點      (gdb) info break ##檢視已經設定的斷點資訊      (gdb) clear 10 ##刪除該行斷點

8、執行程式和單步執行      如果CentOS不能正常執行如下命令,需要先進行如下配置:      $ cd/etc/yum.repos.d      $ sudo vim  CentOS-Debuginfo.repo ##檔案為只讀,需要用sudo開啟修改
     將enabled=0修改為enabled=1,儲存退出。
     $ sudo yum install yum-utils      $ sudo yum install nss-softokn-debuginfo --nogpgcheck      $ sudo yum install glibc      需要在ipv4下下載安裝。      $ sudo debuginfo-install glibc-2.17-106.el7_2.4.x86_64 ##具體的版本號可以根據gdb下使用run命令失敗時的系統提示確定,此處如果不能完全安裝成功,可以使用以下兩條語句更新後再次安裝,便可以成功:      $ sudo yum makecache      $ sudo yum update          上述步驟安裝完成後,便可以正常使用除錯命令了。如,在summary.c中第十行設定斷點後:      (gdb)run ##縮寫為 r,執行程式至斷點      (gdb)next ##縮寫為 n,單步執行,不進入函式內部      (gdb)n 2 ##提供一個數字,連續執行 2 行      (gdb)continue ##縮寫為c,執行程式到下一個斷點
     (gdb)step ##縮寫為s,單步執行,進入函式內部

9、監視變數      如果CentOS不能正常執行如下命令,需要先進行如下配置:      (gdb) print sum ##縮寫為p,列印變數sum的值      (gdb) ##重複上一條命令      (gdb) watch sum ##每次使用print比較麻煩,可以用watch設定觀察點,每次sum發生變化,程式就會停下
10、臨時修改變數      程式執行時修改變數的值:      (gdb) set var i = 1 ##將變數 i 的值修改為1
11、檢視堆疊情況:bt
13、常用gdb命令彙總
gdb命令 縮寫 描述
help h 獲取幫助資訊
list l 顯示原始碼
search 向前(朝向檔案尾)搜尋原始碼
reverse-search 向後(朝向檔案頭)搜尋原始碼
break b 設定斷點
info break 檢視斷點資訊
clear 清除當前所在行的斷點
run r 從頭執行程式至第一個斷點
next n 單步執行(不進入函式體)
step s 單步執行(進入函式體)
continue c 從當前行繼續執行程式至下一個斷點
print p 列印變數的值
watch 設定觀察點
set var variable=value 設定變數variable的值為value
bt 檢視執行時棧
quit q 退出gdb