在gdb中运行程序,但忽略正常退出?

在gdb中运行程序,但忽略正常退出?,gdb,squid,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 $ba

我们使用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
但是,时不时地,squid“只是”被停止和重新启动,根本不涉及崩溃。在这种情况下,我仍然收到一封电子邮件,其中包含:

  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
if gdb your args here; then
   mail results
fi