使用gdb進行程序調試2-暫停和繼續

 

/******************************************************************正則表達式

 * 本文爲博主學習《Debugging with GDB》的讀書筆記,版權全部,轉載請註明出處。express

 *多線程

 ******************************************************************/函數

 

暫停和繼續學習

info program:spa

  查看程序的當前狀態。線程

1、Breakpoint調試

break locationip

breakcmd

break ... if cond:

  在某個位置或當前位置設置斷點;設置條件斷點。

condition bnum expression:

  設置breakpoint或者watchpoint的生效條件。

condition bnum

  取消breakpoint或者watchpoint的生效條件。

tbreak location

  設置臨時斷點,只生效一次。

hbreak location

thbreak location

rbreak regex

break file:regex:

  設置(臨時)硬件相關(hardware-assisted)斷點,根據正則表達式設置斷點。

info break [n...]:

   查看斷點狀態。

clear:

  刪除一下指令設置的斷點,在跳到某一段點同時須要刪除該斷點時很是有用。

clear location

  刪除某個位置的斷點。

dlelete [breankpoint] [range ...]:

  刪除某些斷點,直有一個參數,好比del 3, del1-3。若是不加參數,刪除全部斷點。

disable [breankpoint] [range ...]:

  設置斷點無效。

enable [breakpoing] [range ...]:

  設置斷點生效。

 

2、watchpoint和catchpoint

watchpoing、catchpoing和breakpoint一塊兒編號,一些關於breakpoing相關的命令一樣適用於watchpoing和catchpoing,好比info、disable、del等。

watch [-l|-location] expr [thread thread-id] [mask maskvalue]:

  設置watchpoint。

catch event

  event能夠是這些:

  assert、exec、syscall [name | number]、fork、vfork、load、upload、signal [signal ..| 'all']

 

3、斷點命令表

  能夠在斷點後設置cmd list,當中斷時,執行gdb命令。

commands [range ...]

... command list

end

好比:

  break foo if x > 0

  commands

  silent

  print "x is %d\n", x

  cont

  end

 

4、繼續執行

continue

c

fg:

  程序繼續執行。

step

step [count]:

  單步運行,或者count步運行。

next

next [count]:

  next與step的區別是在遇到函數調用時,step會進入子函數,而next不會。

finish:

  執行完本函數並暫停。

return [val]:

  直接返回到上層調用函數,本函數剩餘部分再也不執行。    

until:

  跳出本條語句,在循環中執行到循環外。

until location:

  執行到location或者從當前棧幀返回。

advance location

  向前執行到location位置。

stepi/nexti

  執行一條機器指令並中止。

 

5、跳過函數和文件

  下面這個例子中,你想直接進入foo函數的話有點困難,這個時候須要跳過函數。

  int func(){

    foo(boring());

    bar(boring());

  }

skip function [linespec]:

  在調試時,跳過名爲linespec的函數。

skip file [filename]:

  在filename中全部的函數都被跳過。

 skips能夠被刪除、禁用等。

info skip [range]

skip delete [range]

skip enable [range]

skip disable [range]

 

6、信號

  在調試時,當程序收到信息,gdb的默認操做是:對於SIGALRM、SIGWINCH、SIGCHLD信號,nostop、noprint、pass,即不中斷程序、不打印輸出信號信息、容許信息發送給程序,這樣程序能夠收到這三個信號;對於其它錯誤信號,操做爲stop、print、pass,即打印輸出信號信息而且中斷程序,若是繼續執行,則信號會傳遞給程序。

  在打印輸出中斷信息、中斷程序時,信號其實尚未傳遞給程序。這個時候能夠更改信號處理方式。

info handle    : 顯示信號handle設置

info signal sig    : 顯示制定的信號handle設置

catch signal [signal ...| 'all'] : 設置catchpoing

handle signal [keywords]  : 處理信號方式設置,能夠選擇的option有nostop/stop、print/noprint、pass(ignore)/nopass(noignore)三組方式。

  在signal中斷時,若是中斷設置爲nostop,在執行next/step/stepi時,會跳過中斷處理函數;而若是中斷設置爲sotp,在在執行setp/stepi時,會進入到中斷處理函數。

能夠經過signal sig和queue-signal sig命令給程序發送信號,若是參數爲0,則爲清除當前信號,程序繼續執行。

 

7、多線程的斷點

  有兩種控制線程運行的模式:all-stop mode和non-stop mode,在all-stop模式中,全部線程同時stop,執行step/next時,全部線程同時運行,可是不保證全部線程都是單步運行。

set non-stop on

set non-stop off

show non-stop:

  設置是否啓用non-stop模式,以及查詢當前模式。

  能夠經過&設置程序在後臺執行,好比c &, r&;在程序後臺執行時,能夠經過interrup [-a]中斷程序。

  在多線程程序中,能夠制定斷點在哪一個線程中中斷:

break location thread thread-id

 

/******************************************************************

 * 本文爲博主學習《Debugging with GDB》的讀書筆記,版權全部,轉載請註明出處。

 *

 ******************************************************************/

相關文章
相關標籤/搜索