gdb中忽略訊號處理 SIGPIPE

2021-06-25 22:11:19 字數 1728 閱讀 7564

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會停住你的程式。

print

當被除錯的程式收到訊號時,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...