The Art of Debugging with GDB

來源:互聯網
上載者:User

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的行為)以外,只有當前線程會執行。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.