CH1
1. Ctrl +P,Ctrl+N可以瀏覽以前的命令並編輯,斷行符號鍵則是重複上一次的命令;
2.版本6.1以後,有TERMINAL USER INTERFACE模式提供了基於圖形介面和文本介面的折中;
為了以TUI模式運行gdb,需要指定-tui選項;或者在調試時輸入CTRL+X+A按鍵組合;
3.在run後可以為程式添加參數;
例如 r 6 5, 運行程式並傳了兩個字串參數(需要把6和5用atoi轉為int)
4.在普通模式下,上下鍵用於瀏覽以前的命令曆史;
在TUI模式下,則是用於滾動原始碼子視窗;此時請用CTRL+P CTRL+N查看曆史命令
5.臨時斷點的設定:tbreak命令;類似於捕鼠器模式,一次命中即失效;
6.watch一個變數,每當他的值變化時,就會暫停運行;可以有rwatch,每次讀取時都暫停;
watch a>10 則是,當a首次大於10時,暫停執行
7.當前正在啟動並執行函數frame編號為0;gdb的up和down命令會切換frame;backtrace顯示整個棧
8.condition [斷點號] [停止在該斷點處的條件]
condition 1 i==239(假如斷點號為1)
用break和if可以組合兩個命令
break [行號] if [條件]
CH2 stop and watch your program 1.暫停機制有以下三種: 設定斷點; 監視點:當特定記憶體位置的值發生變化或被讀取時暫停執行; 捕獲點:當特定事件發生時暫停delete可以刪除這三種斷點,如果不加參數,就是清空所有斷點; break *address 這種用法可以用來在虛擬記憶體地址處設定斷點,這對於程式沒有調試資訊的部分(比如原始碼不可用,或者是共用庫)是必須的 捕獲點:用catch來設定,能夠被拋出、捕獲異常、發訊號、調用fork、載入、卸載庫以及很多事件觸發; 2 斷點的屬性: 用info b輸出屬性。 類型Type:指出是斷點、監視點還是捕獲點; Disp(osition):指示斷點下次生效時,會發生什麼事情;有以下三種: keep:斷點繼續存在; del:斷點被刪除,這是tbreak設定的斷點; dis:被禁用;這是enable once 設定的斷點 3.斷點後恢複執行。 next和step、continue就不說了 注意continue可以加個數字參數,意思是忽略多少個斷點; finish:恢複執行,到當前棧幀完成為止; until:不進一步在迴圈中暫停情況下完成當前迴圈 4.讓GDB在每次到達某斷點時自動執行一組命令: 使用commands命令,格式如下 commands break-number 。。。 your command 。。 end 使用silent使GDB安靜的觸發斷點,避免冗餘輸出 如果命令列表中最後一個命令是continue,gdb將會自動繼續執行程式; 5.監視點 硬體監視點: 數量是有限的。如果不可用,會輸出: Stopped; cannot insert breakpoints; You may have requested too many hardware breakpoints and watchpoints; |
CH3 檢查和設定變數
display命令:每次暫停時,就輸出指定條目;
也可以用commands命令
GDB的call命令:
可以調用原始碼中的函數;
2.檢查數組
普通數組只需要print 數組名即可;
若是動態數組 int * arr = new int[10];
print *arr@10
也可以強制類型轉化:
print (int [10]) *arr
3. ptype可以查看結構類型
4.info locals可以查看當前棧的局部變數。
5.直接檢查記憶體
x命令
6.print 和display的選項:
print /x a 以16進位顯示a
其它格式:c表示char,s表示string,f表示float
刪除:undisplay
7.值曆史
GDB的print命令的輸出值被標示為$1 $2.這些值統稱為值曆史;
可以這樣輸出 print $1
8.方便變數
情形:有一個指標p,在不同的時候指向鏈表中的不同節點;
你可能希望監視其中某個節點的值的所有變化;
當p首次指向這個節點時,你可以用方便變數:
set $cur = p
$cur就是方便變數
列印它就是了。
CH4 程式崩潰處理
1.為什麼數組越界訪問不會立即出錯?
假如:機器上的虛擬頁大小為4KB。
聲明了一個int a[200];它不足以佔據一頁;
假如它所在的頁有剩餘空間,那麼越界訪問只要不超過本頁,是不會出錯的。
2.發送訊號給進程的含義:
OS將訊號記錄到相應的進程表中,隨後執行訊號處理常式;
3.CORE FILE
ulimit -c n 控制core檔案大小不超過nKB
要調試core檔案,這個n設定足夠大,否則無法正確core dump
gdb exefile corefile 來調試corefile,它是因為可執行檔exefile執行失敗而產生的。
補充: 在編輯器中設定 set list以顯示定位字元^I 還有ltrace、mtrace等工具。。 |
多線程調試的一項技巧:
命令 : set scheduler-locking off|on|step
在使用step或者continue命令調試當前被調試線程的時候,其他線程也是同時執行的,怎麼只讓被偵錯工具執行呢?通過這個命令就可以實現這個需求。
off 不鎖定任何線程,也就是所有線程都執行,這是預設值。
on 只有當前被偵錯工具會執行。
step 在單步的時候,除了next過一個函數的情況(熟悉情況的人可能知道,這其實是一個設定斷點然後continue的行為)以外,只有當前線程會執行。