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