X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=debug%2Fcatchsegv.sh;h=bd835176d9037c5dfc9fff0d91685e4960ffebe3;hb=187c3869ca6902a32a9c2ce8efba72a336604945;hp=b949352eee18268c9b9c958732c25b963c10d0ab;hpb=c2228a513135bb229cd9c9984e38e52143d5f6dd;p=platform%2Fupstream%2Fglibc.git diff --git a/debug/catchsegv.sh b/debug/catchsegv.sh index b949352..bd83517 100755 --- a/debug/catchsegv.sh +++ b/debug/catchsegv.sh @@ -1,26 +1,24 @@ #! /bin/sh - -# Copyright (C) 1998 Free Software Foundation, Inc. +# Copyright (C) 1998-2015 Free Software Foundation, Inc. # This file is part of the GNU C Library. # Contributed by Ulrich Drepper , 1998. # The GNU C Library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Library General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version. +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. # The GNU C Library 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 -# Library General Public License for more details. +# Lesser General Public License for more details. -# You should have received a copy of the GNU Library General Public -# License along with the GNU C Library; see the file COPYING.LIB. If not, -# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -# Boston, MA 02111-1307, USA. +# You should have received a copy of the GNU Lesser General Public +# License along with the GNU C Library; if not, see +# . if test $# -eq 0; then - echo "$0: missing programm name" >&2 + echo "$0: missing program name" >&2 echo "Try \`$0 --help' for more information." >&2 exit 1 fi @@ -34,12 +32,15 @@ if test $# -eq 0; then echo 'Usage: catchsegv PROGRAM ARGS...' echo ' --help print this help, then exit' echo ' --version print version number, then exit' - echo "Report bugs using the \`glibcbug' script to ." + echo 'For bug reporting instructions, please see:' + cat <<\EOF +@REPORT_BUGS_TO@. +EOF exit 0 ;; --v | --ve | --ver | --vers | --versi | --versio | --version) - echo 'catchsegv (GNU libc) @VERSION@' - echo 'Copyright (C) 1998 Free Software Foundation, Inc. + echo 'catchsegv @PKGVERSION@@VERSION@' + echo 'Copyright (C) 2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Written by Ulrich Drepper.' @@ -50,17 +51,21 @@ Written by Ulrich Drepper.' esac fi -segv_output=`basename "$prog"`.segv.$$ +segv_output=`mktemp ${TMPDIR:-/tmp}/segv_output.XXXXXX` || exit +# Redirect stderr to avoid termination message from shell. +(exec 3>&2 2>/dev/null LD_PRELOAD=${LD_PRELOAD:+${LD_PRELOAD}:}@SLIB@/libSegFault.so \ SEGFAULT_USE_ALTSTACK=1 \ SEGFAULT_OUTPUT_NAME=$segv_output \ -"$prog" ${1+"$@"} +"$prog" ${1+"$@"} 2>&3 3>&-) exval=$? -# Check for a segmentation error. -if test $exval -eq 139 && test -f "$segv_output"; then - # We caught a segmentation error. The output is in the file with the +# Check for output. Even if the program terminated correctly it might +# be that a minor process (clone) failed. Therefore we do not check the +# exit code. +if test -s "$segv_output"; then + # The program caught a signal. The output is in the file with the # name we have in SEGFAULT_OUTPUT_NAME. In the output the names of # functions in shared objects are available, but names in the static # part of the program are not. We use addr2line to get this information. @@ -82,20 +87,21 @@ if test $exval -eq 139 && test -f "$segv_output"; then sed '/Backtrace/q' "$segv_output" sed '1,/Backtrace/d' "$segv_output" | (while read line; do + line=`echo $line | sed "s@^$prog\\(\\[.*\\)@\1@"` case "$line" in - [*) addr=`echo $line | sed 's/^\[\(.*\)\]$/\1/'` - complete=`addr2line -f -e "$prog" $addr 2>/dev/null` - if test $? -eq 0; then - echo "`echo "$complete"|sed 'N;s/\(.*\)\n\(.*\)/\2(\1)/;'`$line" - else - echo "$line" - fi - ;; - *) echo "$line" - ;; + \[*) addr=`echo "$line" | sed 's/^\[\(.*\)\]$/\1/'` + complete=`addr2line -f -e "$prog" $addr 2>/dev/null` + if test $? -eq 0; then + echo "`echo "$complete"|sed 'N;s/\(.*\)\n\(.*\)/\2(\1)/;'`$line" + else + echo "$line" + fi + ;; + *) echo "$line" + ;; esac done) - rm -f "$segv_output" fi +rm -f "$segv_output" exit $exval