1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22: if test $# -eq 0; then
23: echo "$0: missing program name" >&2
24: echo "Try \`$0 --help' for more information." >&2
25: exit 1
26: fi
27:
28: prog="$1"
29: shift
30:
31: if test $# -eq 0; then
32: case "$prog" in
33: --h | --he | --hel | --help)
34: echo 'Usage: catchsegv PROGRAM ARGS...'
35: echo ' --help print this help, then exit'
36: echo ' --version print version number, then exit'
37: echo "For bug reporting instructions, please see:"
38: echo "<http://www.gnu.org/software/libc/bugs.html>."
39: exit 0
40: ;;
41: --v | --ve | --ver | --vers | --versi | --versio | --version)
42: echo 'catchsegv (GNU libc) @VERSION@'
43: echo 'Copyright (C) 2007 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:
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:
65:
66:
67: if test -s "$segv_output"; then
68:
69:
70:
71:
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