信號(Signals)
信號是一種軟中斷,是一種處理異步事件的方法。一般來說,操作系統(tǒng)都支持許多信號。尤其是UNIX,比較重要應(yīng)用程序一般都會處理信號。UNIX定義了許 多信號,比如SIGINT表示中斷字符信號,也就是Ctrl+C的信號,SIGBUS表示硬件故障的信號;SIGCHLD表示子進(jìn)程狀態(tài)改變信號; SIGKILL表示終止程序運(yùn)行的信號,等等。信號量編程是UNIX下非常重要的一種技術(shù)。
GDB有能力在你調(diào)試程序的時(shí)候處理任何一種信號,你可以告訴GDB需要處理哪一種信號。你可以要求GDB收到你所指定的信號時(shí),馬上停住正在運(yùn)行的程序,以供你進(jìn)行調(diào)試。你可以用GDB的handle命令來完成這一功能。
handle
在GDB中定義一個信號處理。信號可以以SIG開頭或不以 SIG開頭,可以用定義一個要處理信號的范圍(如:SIGIO-SIGKILL,表示處理從SIGIO信號到SIGKILL的信號,其中包括SIGIO, SIGIOT,SIGKILL三個信號),也可以使用關(guān)鍵字all來標(biāo)明要處理所有的信號。一旦被調(diào)試的程序接收到信號,運(yùn)行程序馬上會被GDB停住,以 供調(diào)試。其可以是以下幾種關(guān)鍵字的一個或多個。
nostop
當(dāng)被調(diào)試的程序收到信號時(shí),GDB不會停住程序的運(yùn)行,但會打出消息告訴你收到這種信號。
stop
當(dāng)被調(diào)試的程序收到信號時(shí),GDB會停住你的程序。
print
當(dāng)被調(diào)試的程序收到信號時(shí),GDB會顯示出一條信息。
noprint
當(dāng)被調(diào)試的程序收到信號時(shí),GDB不會告訴你收到信號的信息。
pass
noignore
當(dāng)被調(diào)試的程序收到信號時(shí),GDB不處理信號。這表示,GDB會把這個信號交給被調(diào)試程序會處理。
nopass
ignore
當(dāng)被調(diào)試的程序收到信號時(shí),GDB不會讓被調(diào)試程序來處理這個信號。
info signals
info handle
查看有哪些信號在被GDB檢測中。
另外補(bǔ)充:
信號的處理
程序是和網(wǎng)絡(luò)相關(guān)的,調(diào)試期間經(jīng)常地收到SIGPIPE,導(dǎo)致gdb停下來。看了一下gdb info,解決方法很簡單。用handle命令設(shè)置一下缺省signal的處理行為就可以了:
handle SIGPIPE nostop
如果連提示信息都不想看見,就可以這樣設(shè)置:
handle SIGPIPE nostop noprint
就可以了。其他相關(guān)信號也可以類似處理。想了解目前的signal狀態(tài)可以使用info signal
察看。
啟動配置文件
GDB使用中比較麻煩的事情,就是每次啟動,還要手動敲一把命令,特別是斷點(diǎn)比較多的情況,這個特便影響,工作效率。查了一下gdb info,gdb支持自動讀取一個啟動腳本文件.gdbinit,所以經(jīng)常輸入的啟動命令,就都可以寫在gdb啟動目錄的.gdbinit里面。比如
.gdbinit:
file myapp
handle SIGPIPE nostop
break ss.c:100
break ss.c:200
run
GDB和bash類似,也支持source這個命令,執(zhí)行另外一個腳本文件。所以可以修改一下.gdbinit:
.gdbinit:
file myapp
handle SIGPIPE nostop
source gdb.break
run
gdb.break:
break ss.c:100
break ss.c:200
這樣修改的斷點(diǎn)配置,只需要編輯gdb.break就可以了。再后來,偶而還是需要單獨(dú)啟動GDB,不想執(zhí)行自動腳本,于是又改進(jìn)了一下。首先把.gdbinit命名為gdb.init,然后定義一個shell alias:
$ alias .gdb=”gdb -x gdb.init”
這樣如果需要使用自動腳本,就用.gdb命令,否則用gdb進(jìn)入交互狀態(tài)的gdb。這樣配置以后可以一個簡單命令就開始調(diào)試,整個效率就能提高不少。
注:轉(zhuǎn)自http://blog.scaner.i.thu.cn/index.php/2006/04/15/gdb-tips-1/
注解
1alias命令
alias
顧名思義就是起別名的意思,在linux里,可以通過alias命令為常用命令設(shè)置快捷方式,命令格式如下: alias name='command' 例如:alias del='rm'
欲顯示系統(tǒng)已有別名,直接使用 alias或alias -p
若需要設(shè)置的命令別名比較多,可以直接修改/etc/bashrc或~/.bashrc,將需要的別名寫到里面即可,不同之處是/etc/bashrc設(shè)置的別名對于所有登錄用戶都起作用,而~/.bashrc只對目前用戶起作用。