wireshark/test/run_and_catch_crashes
Guy Harris 357cfd3b03 A bunch of "{Mac} OS X" -> "macOS" changes.
Avoid anachronisms, however; there was no "macOS 10.0" or even "OS X
10.0", for example.  It was "Mac OS X" until 10.8 (although 10.7 was
sometimes called "OS X" and sometimes called "Mac OS X"), and it was "OS
X" from 10.8 to 10.11.

Change-Id: Ie4a848997dcc6c45c2245c1fb84ec526032375c3
Reviewed-on: https://code.wireshark.org/review/20933
Reviewed-by: Guy Harris <guy@alum.mit.edu>
2017-04-05 19:16:22 +00:00

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 macOS, 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