gdb除錯網路程式時,會遇到sigpipe資訊,預設gdb會把程式停下來,即使程式使用signal(sigpipe, sig_ign);來忽略訊號。
用handle命令設定一下預設的signal的處理行為即可:(在gdb模式下執行下面的命令)
handle sigpipe nostop print
如果連資訊提示都不想看見,可以這樣設定:
handle sigpipe nostop noprint
訊號(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會停住你的程式。
當被除錯的程式收到訊號時,gdb會顯示出一條資訊。
noprint
當被除錯的程式收到訊號時,gdb不會告訴你收到訊號的資訊。
pass
noignore
當被除錯的程式收到訊號時,gdb不處理訊號。這表示,gdb會把這個訊號交給被除錯程式會處理。
nopass
ignore
當被除錯的程式收到訊號時,gdb不會讓被除錯程式來處理這個訊號。
info signals
info handle
檢視有哪些訊號在被gdb檢測中。
另外補充:
訊號的處理啟動配置檔案
這樣如果需要使用自動指令碼,就用.gdb命令,否則用gdb進入互動狀態的gdb。這樣配置以後可以乙個簡單命令就開始除錯,整個效率就能提高不少。
注:**
註解1alias命令
alias
顧名思義就是起別名的意思,在linux裡,可以通過alias命令為常用命令設定快捷方式,命令格式如下: alias name='command' 例如:alias del='rm'
欲顯示系統已有別名,直接使用 alias或alias -p
若需要設定的命令別名比較多,可以直接修改/etc/bashrc或~/.bashrc,將需要的別名寫到裡面即可,不同之處是/etc/bashrc設定的別名對於所有登入使用者都起作用,而~/.bashrc只對目前使用者起作用。
gdb時發出SIGTRAP訊號的處理
在大多數系統,gdb對使用fork建立的程序沒有進行特別的支援。當父程序使用fork建立子程序,gdb仍然只會除錯父程序,而子程序沒有得到控制和除錯。這個時候,如果你在子程序執行到的 中設定了斷點,那麼當子程序執行到這個斷點的時候,會產生乙個sigtrap的訊號,如果沒有對此訊號進行捕捉處理,就會按...
Linux中的訊號處理
突然想起使用sigaction註冊訊號處理函式時,訊號處理函式型別有二個 struct sigaction 通過對上面的sa flags賦值為sa siginfo,讓系統使用多引數的訊號處理函式。在處理函式中,由於傳進來乙個siginfo t的引數,我們可以通過它獲取到哪個程序傳進來的訊息。今天試了...
Golang中的訊號處理
個平台的訊號定義或許有些不同。下面列出了posix中定義的訊號。linux 使用34 64訊號用作實時系統中。命令man 7 signal提供了官方的訊號介紹。在posix.1 1990標準中定義的訊號列表訊號值 動作說明 sighup 1term 終端控制程序結束 終端連線斷開 sigint 2t...