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


 

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

 * 本文為博主學習《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》的讀書筆記,版權所有,轉載請注明出處。

 *

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM