【Linux學習筆記八】Linux程式設計-編譯(gcc)與除錯(gdb)
阿新 • • 發佈:2019-02-08
【注】文章中的所有截圖均為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)生成相關資訊 |
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
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 | 從當前行繼續執行程式至下一個斷點 |
p | 列印變數的值 | |
watch | 設定觀察點 | |
set var variable=value | 設定變數variable的值為value | |
bt | 檢視執行時棧 | |
quit | q | 退出gdb |