作者indark (半世音緣)
標題[轉錄][轉錄] GDB 的妙用
時間Thu Jun 22 11:18:09 2006
※ [本文轉錄自 indark 信箱]
作者: indark.bbs@cpu.tfcis.org ("暢快一生 有樂相隨")
標題: [轉錄] GDB 的妙用
時間: Thu Jun 22 11:17:48 2006
作者: xeon (xeon) 看板: xeon
標題: [轉錄] GDB 的妙用
時間: 2006/06/22 Thu 00:06:28
http://blog.vgod.tw/?p=122
vgod’s blog
06.21.06
GDB的妙用
Posted in Tips at 2:12 am by vgod
今天有個同學跑來跟我求救。他說有隻重要的程式在工作站上面跑,但沒有放在
screen裡面,可是Windows的鍵盤滑鼠都卡死了,有沒有辦法能重新開機(也就是
關掉windows上的terminal, putty)而且讓程式能繼續跑下去..。
其實我以前也遇過同樣的問題,只是一直沒去想怎麼解決,後來都習慣用screen,
就自然不會遇到這問題了。可是我最近發現,其實有不少人都不知道UNIX上有
screen這個好東西,於是只要跑些重要的程式,就得擺一個terminal在桌面上,而
且千千萬萬不能關掉,否則跑了數天的結果就這樣白費了。
今天再次碰到這個問題時,仔細想了一下,terminal關掉會讓程式中斷的關鍵在於
,程式會在terminal關閉時收到SIGHUP這個signal,而不處理這個signal的結果就
是結束程式。在以前還不知道screen這東西前,都得用nohup這個指令來事先攔截
SIGHUP。
那現在碰到的問題就是,有沒有辦法在程式執行到一半的時候,先在它收到SIGHUP
之前把這signal擋下來?或是直接在它執行中修改它的程式碼,讓它忽略SIGHUP…
?
想在runtime時變更程式的行為,讓我馬上想到gdb這個好東西。gdb可以在程式執
行到一半時,attach到它的process上,接著就能做所有gdb能做的事情..。gdb能
做的當然不只是debug啦,gdb可以在runtime改變程式的執行流程和行為,還能攔
截程式本來應該要收到的signal…,咦,這好像就是解答了嘛!
從Debugging with GDB可以查到,只要在gdb裡輸入這樣的指令,底下的程式就不
會收到SIGHUP了。
handle SIGHUP nopass
所以這問題的解法很簡單。
從另一台電腦連上正在跑重要程式的工作站
用ps和grep找出那個程式的pid
用gdb attach它: gdb [program] [pid]
在gdb內輸入: handle SIGHUP nopass
把當掉的windows重新開機,在gdb內輸入continue讓程式繼續執行
你會看到gdb攔截到SIGHUP的訊息,再輸入continue就可以了
--
XEON XEON XEON XEON XEON ▃▃▃▃▃ ▃▃
▃▃ X
E█ █◣
◢█ █◤◢█
█ ◤◢█
█ ◢█
◣◢◣◥▌▌ !▌ ▌ ██ E
O█ ◥█
█◤ ◢█
◢▌◢█
▌ ◥██
█▋ ▌▌ ▌ ▌ = ██ O
N█ ◢█
███ ██
█◤ ██
◢▌ ◢█◤
█▋ ▌ ▌ ▌ ██ N
!█ █◤◥█◤ ◥█◣
◣◥██◤ ◥█▌◥█◤
▅▅▅▅▅▅ ████ !
--
=[﹎:≡◢◣≡
:﹎ Origin ]|[ 動力核心 cpu.tfcis.org ]|[≡˙≡﹎:]=
=[
﹊:≡◥╱≡
:﹊ Author ]|[
125-229-161-196.dynamic.hi]|[≡
●≡﹊:]
=
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.48.60
→ indark:剛剛試了一下.. it works! 06/22 11:18
推 Donnie:what is 當掉的windows重新開機? 06/22 13:25
推 moonshade:就是在remote console上面做到一半掛掉了 06/22 14:51
→ moonshade:想要重開但是不要跑一半的程式停掉 06/22 14:51
推 Donnie:i see. 有 GUI 的可以嗎? O_O 06/22 18:40
推 indark:應該是檢不回來了 06/22 22:56