2011年1月25日 星期二

【C/C++】"GNU 程式設計" 讀書整理(part 4)

【ch6. C及C++程式除錯器】
gdb 可讓你執行程式,再程式中設定中斷點,再執行過程中檢視並修改變數,呼叫函式,並追蹤程式的執行過程。

gdb 的編譯
gcc編譯程式時必須啟用 -g 選項來產生符號表以 debug。-g 及 -O 並不衝突,可同時兼顧效能和除錯,但經過最佳化的程式,除錯會比較困難。

啟動 gdb
gdb test [core-dump]-q (忽略開場白和版權訊息)
-d (到 dir 路徑尋找原始檔案,當程式分散再多個路徑下時 )

gdb 基本指令
list (列示檔案)
list line1,line2
gdb 無法分辨 #ifdef 和 #include 造成的流程改變

run (執行程式)
參數可使用,標準輸出入 < 及 >,及 shell 萬用字元 (*, ?, [, ])。
run -b < invalues > outtable
若 run 沒給予參數,預設會使用上次的 run 參數。可用 set args 改變參數,也可用 show argd來察看參數。

backtrace (回溯堆疊內容,以顯示程式當掉時的行為)
whatis (顯示檔案宣告,資料結構的名稱)
ptype (資料結構的定義)
print (除了可列印變數外,還印出函式、資料結構、歷史值($1, $2...)、假陣列(印出h後10各元素 h@10,注意這個震列會變成歷史值,若要參考它的第7個元素 $13[6],看接下來的10個元素$13[0]@10)。若要垂直印出可 set print array。)
print trans::foo
print 'trans.c'::foo
set variabel (設定變數的值)

break line-number ()
break function-name ()
break routine-name ()
break function-name if condition ()
break 46 if testsize == 100

tbreak (暫時的中斷點,使用一次便 disable,可用 enable 再啟動)
continue (從中斷點繼續執行)
info breakpoints (察看中斷點)
disable number
enable number
enable once number

watch (設定監看點 watchpoint,類似 break if,但若無硬體的支援,效能會慢上 100 倍)
watch testsize > 100000 (設定當變數大於 100000 時停止)
一些除錯的方法
* 再可能當掉的地方設定 breakpoint
* 設定 watchpoint
* 用 continue 讓程式繼續執行
* 讓你的程式執行一整夜

單步執行有兩種
* next 若碰到函式呼叫,會執行完整個函式
* step 則會浸入函式,一步一步執行
break main
run
測試 step 和 next

call name (呼叫函式)
finish (結束目前函式並印出傳回值)
return value (取消目前函式執行,並傳回 value)

commands number
...list-of-commands
...list-of-commands
end
(自動執行命列,命令列依附再第 number 個中斷點/監看點上 )

機器語言功能
info line 121
disassemble 0x260c 0x261c
info registers
現代處理器幾乎都有4個通用暫存器
* $pc:程式計數器
* $fp:堆疊框指標
* $sp:堆疊指標
* $ps :處理器狀態

gdb 能抓到所有的系統信號
handle (命令控制信號的處理)
參數至少有兩個:信號名稱,收到信號後處理的動作
nonstop (收到信號傳給程式,但不停止程式)
stop (收到信號後停止程式,來除錯)
nonprint (收到信號後不顯示訊息)
print
nopass (停掉程式,但不讓信號傳給程式)
pass (將信號傳給程式,讓你的程式去處理)
handle SIGPIPE stop print

signal SIGINT (送參數給程式)

使用 scripts
source setbkpts.gdb

附加到現有行程除錯
test &
ps | grep test
gdb test 2912
 

沒有留言:

張貼留言