#! /bin/sh # # 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 <&2 <&2 <&2 <