Wednesday, September 14, 2011

GDB常用指令

在Linux中寫了一個程式,但往往執行的結果都是出乎你的意料,因為可能是某個部份邏輯錯誤,所以可能會造成程式當掉了,因此我們使用GNU gdb這個除錯程式來除bug,而常使用的基本指令和基本用法,介紹給大家。

※ 編譯時加入-g的參數

為了讓gdb可以debug你的程式,所以在你編譯的期間,必須加入-g的參數,如此才可以讓gdb來除錯,所以編譯時的語法。

gcc ex.c -g -o ex

基本上編不過就是你程式語法或是語義的錯誤,而除錯主要是用在,程式可以正確的執行,但是執行出來的結果卻不是你要的,如果才需要除蟲。開始執行gdb除錯程式。

gdb ./your_programe

※ gdb的指令

進入gdb之後會類似像shell一樣有個提示字元,所以也和shell一樣要輸入你要執行的指令。

1. 環境的設定

* file ./your_programe 開始別的程式除錯
* set args xxx xxx 將xxx xxx當成參數執行你的程式
* set listsize n 設定使用list指令會一次顯示n行

2. 中斷點的設定

* break(b) n | function_name 設定中斷點在行或函式
* break(b) filename:n 如果是多個c檔案時指定filename和第n行
* clear n 清除第n行的中斷點
* delete index 清除第index號的中斷點
* disable index 暫時使第index號中斷無作用
* enable index 使第index號中斷再作用

3. 開始執行debug

* run 當都設定好你要給此程式的參數後開始執行
* quit 離開gdb除錯程式

4. 開始追蹤程式

* continue(c) 繼續執行直到下一個中斷點或結束
* next(n) 執行一行程式碼,不會跳進函式去執行
* step(s) 執行一行程式碼,如果碰到函式會跳進函式內部去執行
* until(u) 跳離一個while for迴圈

5. 監看你想知道的變數值

* print(p) 印出某個變數的資料
* display 會每次step, next時都會印出值來,print只印一次
* list(l) 向下列出程式碼,和listsize行數有關
* list(l) - 向上列出程式碼,和listsize行數有關
* list(l) n 列出第n行的程式碼

6. 其它觀看設定

* info (i) break (b) 看目前有建立的中斷點列表
* show args 顯示目前給此程式的參數
* show listsize 顯示目前使用list指令會一次顯示多少行

Reference:
http://hsian-studio.blogspot.com/2008/09/gdb.html

No comments: