/******************************************************************
* 本文為博主學習《Debugging with GDB》的讀書筆記,版權所有,轉載請注明出處。
*
******************************************************************/
暫停和繼續
info program:
查看程序的當前狀態。
一、Breakpoint
break location
break
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 ...]:
設置斷點生效。
二、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']
三、斷點命令表
可以在斷點后設置cmd list,當中斷時,執行gdb命令。
commands [range ...]
... command list
end
比如:
break foo if x > 0
commands
silent
print "x is %d\n", x
cont
end
四、繼續執行
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
執行一條機器指令並停止。
五、跳過函數和文件
下面這個例子中,你想直接進入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]
六、信號
在調試時,當程序收到信息,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,則為清除當前信號,程序繼續執行。
七、多線程的斷點
有兩種控制線程運行的模式: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》的讀書筆記,版權所有,轉載請注明出處。
*
******************************************************************/