| xf.li | bdd93d5 | 2023-05-12 07:10:14 -0700 | [diff] [blame] | 1 | #!/bin/sh | 
 | 2 | # Copyright (C) 1998-2016 Free Software Foundation, Inc. | 
 | 3 | # This file is part of the GNU C Library. | 
 | 4 | # Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. | 
 | 5 |  | 
 | 6 | # The GNU C Library is free software; you can redistribute it and/or | 
 | 7 | # modify it under the terms of the GNU Lesser General Public | 
 | 8 | # License as published by the Free Software Foundation; either | 
 | 9 | # version 2.1 of the License, or (at your option) any later version. | 
 | 10 |  | 
 | 11 | # The GNU C Library is distributed in the hope that it will be useful, | 
 | 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 | 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
 | 14 | # Lesser General Public License for more details. | 
 | 15 |  | 
 | 16 | # You should have received a copy of the GNU Lesser General Public | 
 | 17 | # License along with the GNU C Library; if not, see | 
 | 18 | # <http://www.gnu.org/licenses/>. | 
 | 19 |  | 
 | 20 | if test $# -eq 0; then | 
 | 21 |   echo "$0: missing program name" >&2 | 
 | 22 |   echo "Try \`$0 --help' for more information." >&2 | 
 | 23 |   exit 1 | 
 | 24 | fi | 
 | 25 |  | 
 | 26 | prog="$1" | 
 | 27 | shift | 
 | 28 |  | 
 | 29 | if test $# -eq 0; then | 
 | 30 |   case "$prog" in | 
 | 31 |     --h | --he | --hel | --help) | 
 | 32 |       echo 'Usage: catchsegv PROGRAM ARGS...' | 
 | 33 |       echo '  --help      print this help, then exit' | 
 | 34 |       echo '  --version   print version number, then exit' | 
 | 35 |       echo 'For bug reporting instructions, please see:' | 
 | 36 |       cat <<\EOF | 
 | 37 | @REPORT_BUGS_TO@. | 
 | 38 | EOF | 
 | 39 |       exit 0 | 
 | 40 |       ;; | 
 | 41 |     --v | --ve | --ver | --vers | --versi | --versio | --version) | 
 | 42 |       echo 'catchsegv @PKGVERSION@@VERSION@' | 
 | 43 |       echo 'Copyright (C) 2016 Free Software Foundation, Inc. | 
 | 44 | This is free software; see the source for copying conditions.  There is NO | 
 | 45 | warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 
 | 46 | Written by Ulrich Drepper.' | 
 | 47 |       exit 0 | 
 | 48 |       ;; | 
 | 49 |     *) | 
 | 50 |       ;; | 
 | 51 |   esac | 
 | 52 | fi | 
 | 53 |  | 
 | 54 | segv_output=`mktemp ${TMPDIR:-/tmp}/segv_output.XXXXXX` || exit | 
 | 55 |  | 
 | 56 | # Redirect stderr to avoid termination message from shell. | 
 | 57 | (exec 3>&2 2>/dev/null | 
 | 58 | LD_PRELOAD=${LD_PRELOAD:+${LD_PRELOAD}:}@SLIB@/libSegFault.so \ | 
 | 59 | SEGFAULT_USE_ALTSTACK=1 \ | 
 | 60 | SEGFAULT_OUTPUT_NAME=$segv_output \ | 
 | 61 | "$prog" ${1+"$@"} 2>&3 3>&-) | 
 | 62 | exval=$? | 
 | 63 |  | 
 | 64 | # Check for output.  Even if the program terminated correctly it might | 
 | 65 | # be that a minor process (clone) failed.  Therefore we do not check the | 
 | 66 | # exit code. | 
 | 67 | if test -s "$segv_output"; then | 
 | 68 |   # The program caught a signal.  The output is in the file with the | 
 | 69 |   # name we have in SEGFAULT_OUTPUT_NAME.  In the output the names of | 
 | 70 |   # functions in shared objects are available, but names in the static | 
 | 71 |   # part of the program are not.  We use addr2line to get this information. | 
 | 72 |   case $prog in | 
 | 73 |   */*) ;; | 
 | 74 |   *) | 
 | 75 |     old_IFS=$IFS | 
 | 76 |     IFS=: | 
 | 77 |     for p in $PATH; do | 
 | 78 |       test -n "$p" || p=. | 
 | 79 |       if test -f "$p/$prog"; then | 
 | 80 | 	prog=$p/$prog | 
 | 81 |       break | 
 | 82 |       fi | 
 | 83 |     done | 
 | 84 |     IFS=$old_IFS | 
 | 85 |     ;; | 
 | 86 |   esac | 
 | 87 |   sed '/Backtrace/q' "$segv_output" | 
 | 88 |   sed '1,/Backtrace/d' "$segv_output" | | 
 | 89 |   (while read line; do | 
 | 90 |      line=`echo $line | sed "s@^$prog\\(\\[.*\\)@\1@"` | 
 | 91 |      case "$line" in | 
 | 92 |        \[*) addr=`echo "$line" | sed 's/^\[\(.*\)\]$/\1/'` | 
 | 93 | 	    complete=`addr2line -f -e "$prog" $addr 2>/dev/null` | 
 | 94 | 	    if test $? -eq 0; then | 
 | 95 | 	      echo "`echo "$complete"|sed 'N;s/\(.*\)\n\(.*\)/\2(\1)/;'`$line" | 
 | 96 | 	    else | 
 | 97 | 	      echo "$line" | 
 | 98 | 	    fi | 
 | 99 | 	    ;; | 
 | 100 | 	 *) echo "$line" | 
 | 101 | 	    ;; | 
 | 102 |      esac | 
 | 103 |    done) | 
 | 104 | fi | 
 | 105 | rm -f "$segv_output" | 
 | 106 |  | 
 | 107 | exit $exval |