作者indark (半世音缘)
标题[转录][转录] GDB 的妙用
时间Thu Jun 22 11:18:09 2006
※ [本文转录自 indark 信箱]
作者:
[email protected] ("畅快一生 有乐相随")
标题: [转录] 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
1F:→ indark:刚刚试了一下.. it works! 06/22 11:18
2F:推 Donnie:what is 当掉的windows重新开机? 06/22 13:25
3F:推 moonshade:就是在remote console上面做到一半挂掉了 06/22 14:51
4F:→ moonshade:想要重开但是不要跑一半的程式停掉 06/22 14:51
5F:推 Donnie:i see. 有 GUI 的可以吗? O_O 06/22 18:40
6F:推 indark:应该是检不回来了 06/22 22:56