wireshark/test/run_and_catch_crashes

128 lines
2.8 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
#
# SPDX-License-Identifier: GPL-2.0-or-later
#
# 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