C - GDB


攔截訊息,讓已執行的不中斷,可繼續執行
gdb [program] [pid]
handle SIGHUP nopass
收到訊號後再打continue


假如
gcc -Wall -g -o ssort ssort_bug.c 
./ssort 12.3 -17 6.5 結果出現 Segmentation fault
gdb ssort
餵給 ssort 程式相同的命令列參數  run 12.3 -17 6.5
死掉後下 where
打 l  後,可以按 up 鍵
可輸入 l ssort_bug.c:12
變數印出來看看吧: p i
p argv[i] 呢? 
b main 這句話的意思是在進入副程式 main 的入口處設一個 break point 中斷點
下 b ssort_bug.c:7 也可以
用 i b 查看一下現在已經設定了那些 break points
用 d b 1 將唯一的 break point 刪除
下 n 叫它執行一步
然後一直按 Enter, 同時注意它正在執行那一列
過程可下 p 指令, 把可疑變數的值印出來看




假設你要對 a.out 除錯, 可以下指令: gdb a.out 進入 gdb 之後有下列常用指令可用:

基本指令
quit: 結束
help: 求助 (可加指令名稱)
run: 執行程式 (可加餵給程式的命令列參數)
list: 列印程式本文 (可加列號或函數名稱)
print: 印出運算式的值
中斷指令
break 列號或函數名稱: 設定中斷點
info break: 看我們已設定了那些中斷點
disp 運算式: 每次中斷就顯示這個運算式
info disp: 看我們已設定了那些顯示式
next: 執行一列程式碼 (可加欲執行的列數)
step: 執行一列程式碼, 但是如果遇到函數呼叫, 要跳進函數裡去一步一步執行, 不要把整個函數呼叫當做一步來執行.
cont: 執行下去, 直到下一個中斷點或程式結束為止
用於運算式 (例如 print 及 disp 的參數) 中的特殊變數:
$: 前一次的運算式
$$: 兩次前的運算式
$7: 第七個運算式
$$7: 倒數第七個運算式
與堆疊有關的指令:
where: 顯示目前副程式層層呼叫的狀況
up: 往上一層
down: 往下一層
其他指令:
[CR]: 重複上一個動作
事實上大部分的指令只要沒有混淆之虞, 都不必完整地打完, 例如 info break 可以簡單地打 i b 就好了.







沒有留言:

張貼留言