我在 tmux 会话中的 gdb 中以前台模式调试运行守护程序应用程序。此守护程序偶尔会因 SIGSEGV 崩溃。这次崩溃的结果对外界来说并没有立即显现出来,所以我可能需要一段时间才能发现守护进程已经崩溃。我想在发生崩溃时立即收到某种通知,即使是电子邮件也可以。我没有从 man gdb 那里找到任何帮助。这是如何(如果有的话)实现的?
~ $ gdb --version
GNU gdb (Gentoo 7.2 p1) 7.2
我在 tmux 会话中的 gdb 中以前台模式调试运行守护程序应用程序。此守护程序偶尔会因 SIGSEGV 崩溃。这次崩溃的结果对外界来说并没有立即显现出来,所以我可能需要一段时间才能发现守护进程已经崩溃。我想在发生崩溃时立即收到某种通知,即使是电子邮件也可以。我没有从 man gdb 那里找到任何帮助。这是如何(如果有的话)实现的?
~ $ gdb --version
GNU gdb (Gentoo 7.2 p1) 7.2
便宜又丑陋的东西:
while sleep 30 ; ps auxw | grep progname | grep " t "` && mail -s CRASHED username@host < /etc/hostname ; done
如果您希望它只发送一次;)那么还有更多工作要做。但是每 30 秒发送一封电子邮件,直到你杀死这可能只是诀窍。
看起来我已经解决了这个问题,过了一会儿又回到了它。在Make gdb 在成功终止时自动退出的答案之一中关于 $_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