forked from osmocom/wireshark
746e04976e
I'd just copied and pasted the copyright notice from test/test.sh; Ulf wrote test/test.sh, but didn't write test/run_and_catch_crashes - I did, but, hey, might as well give the copyright to Gerald. Fix the date as well. Change-Id: Id307f354289ca72931dd83f472d879d733618e3c Reviewed-on: https://code.wireshark.org/review/16910 Reviewed-by: Guy Harris <guy@alum.mit.edu>
140 lines
3.4 KiB
Bash
Executable file
140 lines
3.4 KiB
Bash
Executable file
#! /bin/sh
|
|
#
|
|
# Run command in a way that catches crashes
|
|
#
|
|
# Wireshark - Network traffic analyzer
|
|
# By Gerald Combs <gerald@wireshark.org>
|
|
# Copyright 2015 Gerald Combs
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; either version 2
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
#
|
|
# Run the command we're passed in a subshell, so that said subshell will
|
|
# catch any signals from it and report it.
|
|
#
|
|
# This must be done for commands that aren't the last command in the
|
|
# pipeline, as, given that the exit status of a pipeline is the exit
|
|
# status of the last command in the pipeline, there's no guarantee that
|
|
# the shell will bother to pick up the exit status of earlier commands
|
|
# in the pipeline.
|
|
#
|
|
# It can also be done for other tests, to get more information than
|
|
# "it crashed due to signal XXX" if the tests fail with a crash signal.
|
|
#
|
|
# XXX - on OS X, core dumps are in /cores/core.{PID}; would they appear
|
|
# elsewhere on any other UN*X?
|
|
#
|
|
rm -f core
|
|
"$@"
|
|
exitstatus=$?
|
|
if [ -r core ]
|
|
then
|
|
#
|
|
# Core dumped - try to get a stack trace.
|
|
#
|
|
# First, find the executable. Skip past env and any env
|
|
# arguments to find the actual executable path. (If you
|
|
# run a program with an explicit path, and it dumps core,
|
|
# at least on Solaris the output of "file" on the core dump
|
|
# will not give the path, so we don't use that.)
|
|
#
|
|
if [ "$1" = "env" ]
|
|
then
|
|
#
|
|
# Skip past the env command name.
|
|
#
|
|
shift
|
|
#
|
|
# Skip past environment-variable arguments; anything
|
|
# with an "=" in it is an environment-variable argument.
|
|
#
|
|
while expr "$1" : ".*=.*" >/dev/null 2>&1
|
|
do
|
|
shift
|
|
done
|
|
echo last expr command was expr "$1" : ".*=.*"
|
|
fi
|
|
if [ -x "$1" ]
|
|
then
|
|
executable="$1"
|
|
else
|
|
executable=`which "$1"`
|
|
fi
|
|
|
|
if [ ! -z "$executable" ]
|
|
then
|
|
#
|
|
# Found the executable.
|
|
# Is it a libtool wrapper script? Look for a .libs
|
|
# directory.
|
|
#
|
|
executable_dirname=`dirname "$executable"`
|
|
if [ -d "$executable_dirname"/.libs ]
|
|
then
|
|
is_libtool_wrapper=yes
|
|
else
|
|
is_libtool_wrapper=no
|
|
fi
|
|
|
|
#
|
|
# Now, look for a debugger.
|
|
# XXX - lldb?
|
|
#
|
|
dbx=`which dbx`
|
|
if [ ! -z "$dbx" ]
|
|
then
|
|
#
|
|
# Found dbx. Run it to get a stack trace;
|
|
# cause the stack trace to go to the standard
|
|
# error.
|
|
#
|
|
if [ $is_libtool_wrapper = yes ]
|
|
then
|
|
$executable_dirname/libtool --mode=execute dbx "$executable" core 1>&2 <<EOF
|
|
where
|
|
quit
|
|
EOF
|
|
else
|
|
dbx "$executable" core 1>&2 <<EOF
|
|
where
|
|
quit
|
|
EOF
|
|
fi
|
|
else
|
|
gdb=`which gdb`
|
|
if [ ! -z "$gdb" ]
|
|
then
|
|
#
|
|
# Found gdb. Run it to get a stack trace;
|
|
# cause the stack trace to go to the standard
|
|
# error.
|
|
#
|
|
if [ $is_libtool_wrapper = yes ]
|
|
then
|
|
$executable_dirname/libtool --mode=execute gdb "$executable" core 1>&2 <<EOF
|
|
backtrace
|
|
quit
|
|
EOF
|
|
else
|
|
gdb "$executable" core 1>&2 <<EOF
|
|
backtrace
|
|
quit
|
|
EOF
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
exit $exitstatus
|