在gdb中运行程序,但忽略优雅的退出?

时间:2017-01-04 12:32:14

标签: gdb squid

我们正在使用gdb运行squid - 这样我们就可以自动生成回溯以进行调试。

backtrace=`mktemp`
gdb -q -x /etc/service/squid3/gdbcommands /usr/sbin/squid 2>&1 >$backtrace
/usr/bin/mail -s "`hostname`: Squid was restarted (backtrace)" someaddress@charite.de < backtracetrace
rm $backtrace

/ etc / service / squid3 / gdbcommands 包含:

 set args -NsYC
 handle SIGPIPE pass nostop noprint
 handle SIGTERM pass nostop noprint
 handle SIGUSR1 pass nostop noprint
 handle SIGHUP  pass nostop noprint
 handle SIGSEGV stop
 handle SIGABRT stop
 run
 set print pretty
 backtrace full
 generate-core-file
 quit

但是,时不时地,鱿鱼只是&#34;只是&#34;被阻止&amp;重新启动,完全没有崩溃。在这种情况下,我仍然收到一封包含以下内容的电子邮件:

  Reading symbols from /usr/sbin/squid...done.
  [Thread debugging using libthread_db enabled]
  Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
  [Inferior 1 (process 57867) exited normally]
  /etc/service/squid3/gdbcommands:10: Error in sourced command file:
  No stack.
  (gdb) quit

当然没有堆叠,因为程序退出了。

如何更改gdbcommands文件以避免这种情况?

1 个答案:

答案 0 :(得分:1)

这可以使用Python或gdb CLI完成。由于CLI稍微简单一些,如果可能的话,我将草拟这种方法。

首先,您可能只在错误的退出时创建核心文件。而且,我们稍后会使用gdb退出代码,所以让我们安排告诉调用脚本发生了什么。

您当前的脚本所在的位置:

backtrace full
generate-core-file
quit

...改为使用:

if !$_isvoid($_exitsignal) || (!$_isvoid($_exitcode) && $_exitcode != 0))
  backtrace full
  generate-core-file
  quit 0
end
quit 1

然后你的调用脚本可以检查gdb的退出代码:

if gdb your args here; then
   mail results
fi