/******************************************************************正則表達式
* 本文爲博主學習《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》的讀書筆記,版權全部,轉載請註明出處。
*
******************************************************************/