GCC編譯器得使用和gdb除錯得使用

2021-10-07 16:07:15 字數 2868 閱讀 9948

參考文章:

這個文章步驟比較詳細

1、建立.c檔案     :touch  helloword.c

3、帶有除錯資訊的編輯        : gcc -g  helloword.c -o  helloword

注:-g:就是gdb的意思

-o:之後的名字是編譯之後生成的編譯檔案的名字,如果沒有這一項,則會自動生成a.out 檔案。

4、然後進入除錯:gdb helloword

此時進入gdb 的介面,開始輸入gdb的相關命令

1. list/l 命令

可以使用list/l命令檢視程式,方便我們新增斷點時檢視資訊。

list+linenumber(中間有空格)

list 列印函式名稱為function的函式上下文的源程式

list 輸出當前行後面的**

list -顯示當前行前面的**

2. run/r命令

在gdb中執行程式使用run命令.也可以設定程式執行引數。pwd命令用於顯示當前所在目錄。

3. break/b命令

break < function >

在進入指定的函式function時既停止執行,c++中可以使用class::function或function(type, type)格式來指定函式名稱

break < linenumber>

在指定的**行打斷點

break +offset/break -offset

在當前行的前面或後面的offset行打斷點,offset為自然數

break filename:linenumber

在名稱為filename的檔案中的第linenumber行打斷點

break filename:function

在名稱為filename的檔案中的function函式入口處打斷點

break *address

在程式執行的記憶體位址處打斷點

break

在下一條命令處停止執行

break … if < condition>

在處理某些迴圈體中可使用此方法進行除錯,其中…可以是上述的break linenumber、break +offset/break -offset中的引數,其中condition表示條件,在條件成立時程式即停止執行,如設定break if i=100表示當i為100時程式停止執行。

檢視斷點時,也可以使用info命令如info breakpoints [n]、info break [n]其中n 表示斷點號來檢視斷點資訊。

4. 逐步除錯命令

next < count>。單步跟蹤,如果有函式呼叫不會進入函式,如果後面不加count表示一條一條的執行,加count表示執行後面的count條指令,

step < count>。單步跟蹤,如果有函式呼叫則進入該函式(進入該函式前提是此函式編譯有debug資訊),與next類似,其不加count表示一條一條執行,加上count表示自當前行開始執行count條**指令

set step-mode.set step-mode on用於開啟step-mode模式,這樣在進行單步跟蹤時,程式不會因為沒有debug資訊而不停止執行,這很有利於檢視機器碼,可以通過set step-mode off關閉step-mode模式

finish。執行程式直到當前函式完成並列印函式返回時的堆疊位址和返回值及引數值等資訊。

until。執行程式直到退出迴圈體

stepi(縮寫si)和nexti(縮寫ni)。stepi和nexti用於單步跟蹤一條及其指令,一條程式**有可能由數條機器指令完成,stepi和nexi可以單步執行機器指令。

5. continue/c命令

當程式遇到斷點停止執行後可以使用continue命令恢復程式的執行到下乙個斷點或直到程式結束。

6. print命令

請檢視:

7. watch命令

watch命令一般來觀察某個表示式(變數也可視為一種表示式)的值是否發生了變化,如果由變化則程式立即停止執行,其具體用法如下:

watch < expr>

為表示式(變數)expr設定乙個觀察點一旦其數值由變化,程式立即停止執行

rwatch < expr>

當表示式expr被讀時,程式立即停止執行

awatch < expr>

當表示式expr的值被讀或被寫時程式立即停止執行

info watchpoints

列出當前所設定的所有觀察點

8. return命令

如果在函式中設定了除錯斷點,在斷點後還有語句沒有執行完,這個時候我們可以使用return命令強制函式忽略還沒有執行的語句並返回。可以直接使用return命令用於取消當前函式的執行並立即返回函式值,也可以指定表示式如 return < expression>那麼該表示式的值會被作為函式的返回值。

9. info命令

info命令可以用來在除錯時檢視暫存器、斷點、觀察點和訊號等資訊。其用法如下:

info registers:檢視除了浮點暫存器以外的暫存器

info all-registers: 檢視所有的暫存器包括浮點暫存器

info registers < registersname>:檢視指定暫存器

info break: 檢視所有斷點資訊

info watchpoints: 檢視當前設定的所有觀察點

info signals info handle: 檢視有哪些訊號正在被gdb檢測

info line: 檢視源**在記憶體中的位址

info threads: 可以檢視多執行緒

10. finish命令

執行完當前的函式。

run(縮寫r)和quit(縮寫q)分別可以開始執行程式和退出gdb除錯

whatis或ptype顯示變數的型別

bt顯示函式呼叫路徑

GCC編譯器和GDB偵錯程式

gcc gnu compiler collection 是目前linux下最常用的c語言編譯器,它是gnu專案中符合ansi c標準的編譯系統,可以在多種硬體平台上編譯出可執行程式的超級編譯器,執行效率與一般的編譯器相比平均效率要高20 30 在終端中輸入下列命令 gcc options filen...

gcc編譯器和gdb偵錯程式

將高階語言 c語言 程式編譯成為機器可識別的指令 編譯過程 預處理 去掉注釋,展開所有 編譯 語義 語法糾錯,將 解釋成為彙編 彙編 將彙編 解釋成為機器指令 連線 鏈結 庫以及所有的目標檔案,生成可執行程式 庫檔案 大佬實現一些常用的功能介面,為了防止每次編譯耗費大量時間,因此將這些介面 進行編譯...

GCC編譯器和GDB偵錯程式常用選項

gcc hello.c o hello 將hello.c編譯成hello可執行檔案 gcc e hello.c o hello.i 將hello.c 轉換成預處理後的檔案hello.i gcc s hello.c o hello.s 將hello.c 轉換成彙編檔案 hello.s gcc c he...