>>> 此貼的回復 >> 九、信號(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) handle SIGPIPE stop print 請注意,UNIX的信號名總是采用大寫字母!你可以用信號編號替代信號名 如 果你的程序要執行任何信號處理操作,就需要能夠測試其信號處理程序,為此,就需要一種能將信號發送給程序的簡便方法,這就是signal命令的任務。該 命令的參數是一個數字或者一個名字,如SIGINT。假定你的程序已將一個專用的SIGINT(鍵盤輸入,或CTRL-C;信號2)信號處理程序設置成采 取某個清理動作,要想測試該信號處理程序,你可以設置一個斷點並使用如下命令: (gdb) signal 2 continuing with signal SIGINT(2) 該程序繼續執行,但是立即傳輸該信號,而且處理程序開始運行.
[ 關閉窗口 ]