【问题标题】:How to make gdb send an external notification on receiving a signal?如何让 gdb 在收到信号时发送外部通知?
【发布时间】:2011-06-18 06:04:15
【问题描述】:
我在 tmux 会话中的 gdb 内以前台模式调试运行守护程序应用程序。此守护程序偶尔会因 SIGSEGV 崩溃。这次崩溃的结果对外界来说并没有立即显现出来,所以我可能需要一段时间才能发现守护进程已经崩溃。我想在发生崩溃时立即收到某种通知,即使是电子邮件也可以。我没有从 man gdb 那里找到任何帮助。这是如何(如果有的话)实现的?
~ $ gdb --version
GNU gdb (Gentoo 7.2 p1) 7.2
【问题讨论】:
标签:
gdb
notifications
crash-reports
【解决方案1】:
便宜又丑陋的东西:
while sleep 30 ; ps auxw | grep progname | grep " t "` && mail -s CRASHED username@host < /etc/hostname ; done
如果您希望它只发送一次;) 那么还有更多工作要做。但是每 30 秒发送一封电子邮件,直到你杀死这可能只是诀窍。
【解决方案2】:
看起来我已经解决了这个问题,过了一会儿又回到了它。在Make gdb quit automatically on successful termination? 的答案之一中提示有关 $_exitcode 的提示让我走上了这条路,并在gdb hooks 上进行了一些谷歌搜索。
经过一些试验,这就是我现在为这个应用程序的 .gdbinit 所拥有的。好消息是,我可以区分信号,所以正常的 kill 命令给了我一个正常的完全退出三头怪物(tmux + gdb + app),而任何不寻常的东西都会掉到 gdb shell,抽出一封电子邮件并等待我 tmux 诊断:
set $_exitcode = -999
set height 0
handle SIGTERM nostop print pass
handle SIGPIPE nostop
define hook-stop
if $_exitcode != -999
quit
else
shell echo | mail -s "NOTICE: app has stopped on unhandled signal" root
end
end
echo .gdbinit: running app\n
run