#! /bin/sh # # Run command in a way that catches crashes # # Wireshark - Network traffic analyzer # By Gerald Combs # 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 <&2 <&2 <&2 <