运行 gdb 中的一个程序,但忽略了正常退出?

Running a program in gdb, but ignoring a graceful exit?

我们 运行 来自 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

但是,squid 时不时地 "just" 被停止并重新启动,根本没有涉及崩溃。在这种情况下,我仍然会收到一封包含以下内容的电子邮件:

  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 文件来避免这种情况?

这可以使用 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