gdb中信號

信號(Signals)

信號是一種軟中斷,是一種處理異步事件的方法。通常來講,操做系統都支持許多信號。尤爲是UNIX,比較重要應用程序通常都會處理信號。UNIX定義了許 多信號,好比SIGINT表示中斷字符信號,也就是Ctrl+C的信號,SIGBUS表示硬件故障的信號;SIGCHLD表示子進程狀態改變信號; SIGKILL表示終止程序運行的信號,等等。信號量編程是UNIX下很是重要的一種技術。

GDB有能力在你調試程序的時候處理任何一種信號,你能夠告訴GDB須要處理哪種信號。你能夠要求GDB收到你所指定的信號時,立刻停住正在運行的程序,以供你進行調試。你能夠用GDB的handle命令來完成這一功能。

handle
在GDB中定義一個信號處理。信號能夠以SIG開頭或不以 SIG開頭,能夠用定義一個要處理信號的範圍(如:SIGIO-SIGKILL,表示處理從SIGIO信號到SIGKILL的信號,其中包括SIGIO, SIGIOT,SIGKILL三個信號),也可使用關鍵字all來標明要處理全部的信號。一旦被調試的程序接收到信號,運行程序立刻會被GDB停住,以 供調試。其能夠是如下幾種關鍵字的一個或多個。

nostop
當被調試的程序收到信號時,GDB不會停住程序的運行,但會打出消息告訴你收到這種信號。
stop
當被調試的程序收到信號時,GDB會停住你的程序。
print
當被調試的程序收到信號時,GDB會顯示出一條信息。
noprint
當被調試的程序收到信號時,GDB不會告訴你收到信號的信息。
pass
noignore
當被調試的程序收到信號時,GDB不處理信號。這表示,GDB會把這個信號交給被調試程序會處理。
nopass
ignore
當被調試的程序收到信號時,GDB不會讓被調試程序來處理這個信號。


info signals
info handle
查看有哪些信號在被GDB檢測中。
 

信號的處理
程序是和網絡相關的,調試期間常常地收到SIGPIPE,致使gdb停下來。看了一下gdb info,解決方法很簡單。用handle命令設置一下缺省signal的處理行爲就能夠了:
   handle SIGPIPE nostop
若是連提示信息都不想看見,就能夠這樣設置:
   handle SIGPIPE nostop noprint
就能夠了。其餘相關信號也能夠相似處理。想了解目前的signal狀態可使用info signal察看。編程

 

寫了一個INT信號的處理函數,在處理函數裏設置斷點後go,可是在console下按Ctrl-C後MC並無進入處理函數,而console下的程序也直接退出,沒有給出但願的輸出。網絡

    --------------------------------------------------------------------------------異步

    在console下按Ctrl-C後確實發送了SIGINT信號,可是gdb裏的缺省設置將會致使由GDB截獲的該信息,調試的應用程序沒法接受到該信號。函數

    有兩種方法可使調試的應用程序接受到信號:ui

    (1)改變gdb信號處理的設置操作系統

    好比,如下設置會告訴gdb在接收到SIGINT時不要中止、打印出來、傳遞給調試目標程序debug

    =====================================調試

    (gdb) handle SIGINT nostop print passcode

    SIGINT is used by the debugger.進程

    Are you sure you want to change it? (y or n) y

    Signal Stop Print Pass to program Description

    SIGINT No Yes Yes Interrupt

    (gdb)

    =====================================

    (2)使用gdb命令直接向調試的應用程序發送信號

    首先在你但願發送信號的語句處設置斷點,而後運行程序,當中止到斷點所在位置後,用gdb的signal命令發送信號給調試目標程序

    ====================================

    (gdb) signal SIGINT

    Continuing with signal SIGINT.

    Breakpoint 1, handler (signal=2) at main.cpp:15

    15 printf("Signal handler...\n"

    

相關文章
相關標籤/搜索