跳轉到內容

GCC 除錯/gdb

來自 Wikibooks,開放書籍,開放世界

除錯準備

[編輯 | 編輯原始碼]
程式必須先進行編譯以便除錯
gcc -g <filname.c> -o <輸出檔名>
例如: gcc -g debug_me.c -o debug_me
"-g" 標誌很重要(為了建立符號表)

啟動偵錯程式

[編輯 | 編輯原始碼]
使用以下命令啟動偵錯程式
gdb <程式名稱>
例如: gdb debug_me

常用命令

[編輯 | 編輯原始碼]
執行、列印、where、斷點、cond、單步、下一步、設定、忽略
執行程式
在執行時向程式傳遞引數
run <arg1> <arg2>
例如: run 12 35
例如: run "hello world" "goodbye world"
在特定區域\函式處設定“斷點”
break <函式名稱>
例如: break main
例如: b main
break <檔名>:<要停止的程式碼行>
例如: break debug_me.c:5
斷點的簡寫

下一步

[編輯 | 編輯原始碼]
執行下一行程式碼
例如: next
下一行程式碼,單步進入函式
例如: step
轉到下一個斷點或程式結束
繼續的簡寫
列印變數\表示式的值
print <變數名>
例如: print x
在每一步都列印變數\表示式的值
例如: disp x

undisplay

[編輯 | 編輯原始碼]
取消顯示命令
例如: undisplay 3
將停止位置 3 處的變數在每次顯示時都顯示
在呼叫堆疊中移動
...

上移和下移

[編輯 | 編輯原始碼]
上移: 呼叫堆疊中的上一步
下移: 呼叫堆疊中的下一步
顯示特定位置的程式碼
list <無引數>
顯示當前位置的程式碼,然後再次輸入時顯示下一個位置的程式碼
例如: list
list -
顯示先前位置的程式碼,然後再次輸入時顯示之前的位置的程式碼
list <函式名稱>
顯示函式定義中的程式碼
例如: list func1
條件
cond <斷點> <條件>
例如: cond 1 val>0
當“val”大於 0 時,在斷點“1”處停止
更改值,例如
set variable x = 12
將把 x 的值更改為 12

忽略斷點指定次數。

用法: ignore <id> <count>

ignore 2 20 --> 斷點 2 將不會被命中 20 次。

退出 gdb
退出的簡寫
華夏公益教科書