libc: Forgotten adjustment in Versions.def
[dragonfly.git] / usr.sbin / crashinfo / crashinfo.sh
bloba80ba7c58b3c8be786aad192e8ae135c82f8e0a0
1 #!/bin/sh
3 # Copyright (c) 2008 Yahoo!, Inc.
4 # All rights reserved.
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
9 # 1. Redistributions of source code must retain the above copyright
10 # notice, this list of conditions and the following disclaimer.
11 # 2. Redistributions in binary form must reproduce the above copyright
12 # notice, this list of conditions and the following disclaimer in the
13 # documentation and/or other materials provided with the distribution.
14 # 3. Neither the name of the author nor the names of any co-contributors
15 # may be used to endorse or promote products derived from this software
16 # without specific prior written permission.
18 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 # SUCH DAMAGE.
30 # $FreeBSD$
32 usage()
34 echo "usage: crashinfo [-d crashdir] [-n dumpnr] [-k kernel] [core]"
35 exit 1
38 find_kernel()
40 local ivers k kvers file
42 ivers=$(awk '
43 /Version String/ {
44 print
45 nextline=1
46 next
48 // {
49 if (nextline) {
50 print
51 nextline=0
53 }' $INFO)
55 file=`mktemp /tmp/crashinfo.XXXXXX`
56 if [ $? -eq 0 ]; then
57 echo 'printf " Version String: %s", version' > $file
58 # Look for a matching kernel version.
59 for k in /boot/kernel/kernel $(ls -t $CRASHDIR/kern.*) $(ls -t /boot/*/kernel); do
60 kvers=$(gdb -x $file -batch $k 2>/dev/null)
61 if [ "$ivers" = "$kvers" ]; then
62 KERNEL=$k
63 KVERS=$kvers
64 break
66 done
67 rm -f $file
71 CRASHDIR=/var/crash
72 DUMPNR=
73 KERNEL=
74 KVERS=
76 while getopts "d:n:k:" opt; do
77 case "$opt" in
79 CRASHDIR=$OPTARG
82 DUMPNR=$OPTARG
85 KERNEL=$OPTARG
87 \?)
88 usage
90 esac
91 done
93 shift $((OPTIND - 1))
95 if [ $# -eq 1 ]; then
96 if [ -n "$DUMPNR" ]; then
97 echo "-n and an explicit vmcore are mutually exclusive"
98 usage
101 # Figure out the crash directory and number from the vmcore name.
102 CRASHDIR=`dirname $1`
103 DUMPNR=$(expr $(basename $1) : 'vmcore\.\([0-9]*\)$')
104 if [ -z "$DUMPNR" ]; then
105 echo "Unable to determine dump number from vmcore file $1."
106 exit 1
108 elif [ $# -gt 1 ]; then
109 usage
110 else
111 # If we don't have an explicit dump number, operate on the most
112 # recent dump.
113 if [ -z "$DUMPNR" ]; then
114 if ! [ -r $CRASHDIR/bounds ]; then
115 echo "No crash dumps in $CRASHDIR."
116 exit 1
118 next=`cat $CRASHDIR/bounds`
119 if [ -z "$next" ] || [ "$next" -eq 0 ]; then
120 echo "No crash dumps in $CRASHDIR."
121 exit 1
123 DUMPNR=$(($next - 1))
127 VMCORE=$CRASHDIR/vmcore.$DUMPNR
128 INFO=$CRASHDIR/info.$DUMPNR
129 FILE=$CRASHDIR/core.txt.$DUMPNR
130 HOSTNAME=`hostname`
132 if [ ! -e $VMCORE ]; then
133 echo "$VMCORE not found"
134 exit 1
137 if [ ! -e $INFO ]; then
138 echo "$INFO not found"
139 exit 1
142 # If the user didn't specify a kernel, then try to find one.
143 if [ -z "$KERNEL" ]; then
144 find_kernel
145 if [ -z "$KERNEL" ]; then
146 echo "Unable to find matching kernel for $VMCORE"
147 exit 1
149 elif [ ! -e $KERNEL ]; then
150 echo "$KERNEL not found"
151 exit 1
154 echo "Writing crash summary to $FILE."
156 # Simulate uname
157 #ostype=$(echo -e printf '"%s", ostype' | gdb -x /dev/stdin -batch $KERNEL)
158 #osrelease=$(echo -e printf '"%s", osrelease' | gdb -x /dev/stdin -batch $KERNEL)
159 #version=$(echo -e printf '"%s", version' | gdb -x /dev/stdin -batch $KERNEL | \
160 # tr '\t\n' ' ')
161 #machine=$(echo -e printf '"%s", machine' | gdb -x /dev/stdin -batch $KERNEL)
163 exec > $FILE 2>&1
165 echo "$HOSTNAME dumped core - see $VMCORE"
166 echo
167 date
168 echo
169 #echo "$ostype $HOSTNAME $osrelease $version $machine"
170 echo $KVERS
171 echo
172 sed -ne '/^ Panic String: /{s//panic: /;p;}' $INFO
173 echo
175 # XXX: /bin/sh on 7.0+ is broken so we can't simply pipe the commands to
176 # kgdb via stdin and have to use a temporary file instead.
177 file=`mktemp /tmp/crashinfo.XXXXXX`
178 if [ $? -eq 0 ]; then
179 echo "bt" >> $file
180 echo "source /usr/share/misc/gdbinit" >> $file
181 echo "lstok" >> $file
182 echo "psx" >> $file
183 echo "running_threads" >> $file
184 echo "lsvfs" >> $file
185 echo "lsvfsops" >> $file
186 echo "lsmount" >> $file
187 echo "kldstat" >> $file
188 echo "quit" >> $file
189 ( ulimit -t 15; cat $file | kgdb $KERNEL $VMCORE )
190 rm -f $file
191 echo
193 echo
195 echo "------------------------------------------------------------------------"
196 echo "ps -axlwR"
197 echo
198 ps -M $VMCORE -N $KERNEL -axlwR
199 echo
201 echo "------------------------------------------------------------------------"
202 echo "vmstat -s"
203 echo
204 vmstat -M $VMCORE -N $KERNEL -s
205 echo
207 echo "------------------------------------------------------------------------"
208 echo "vmstat -m"
209 echo
210 vmstat -M $VMCORE -N $KERNEL -m
211 echo
213 echo "------------------------------------------------------------------------"
214 echo "vmstat -z"
215 echo
216 vmstat -M $VMCORE -N $KERNEL -z
217 echo
219 echo "------------------------------------------------------------------------"
220 echo "vmstat -i"
221 echo
222 vmstat -M $VMCORE -N $KERNEL -i
223 echo
225 echo "------------------------------------------------------------------------"
226 echo "pstat -T"
227 echo
228 pstat -M $VMCORE -N $KERNEL -T
229 echo
231 echo "------------------------------------------------------------------------"
232 echo "pstat -s"
233 echo
234 pstat -M $VMCORE -N $KERNEL -s
235 echo
237 #echo "------------------------------------------------------------------------"
238 #echo "iostat"
239 #echo
240 #iostat -M $VMCORE -N $KERNEL
241 #echo
243 echo "------------------------------------------------------------------------"
244 echo "ipcs -a"
245 echo
246 ipcs -C $VMCORE -N $KERNEL -a
247 echo
249 echo "------------------------------------------------------------------------"
250 echo "ipcs -T"
251 echo
252 ipcs -C $VMCORE -N $KERNEL -T
253 echo
255 # XXX: This doesn't actually work in 5.x+
256 if false; then
257 echo "------------------------------------------------------------------------"
258 echo "w -dn"
259 echo
260 w -M $VMCORE -N $KERNEL -dn
261 echo
264 echo "------------------------------------------------------------------------"
265 echo "nfsstat"
266 echo
267 nfsstat -M $VMCORE -N $KERNEL
268 echo
270 echo "------------------------------------------------------------------------"
271 echo "netstat -s"
272 echo
273 netstat -M $VMCORE -N $KERNEL -s
274 echo
276 echo "------------------------------------------------------------------------"
277 echo "netstat -m"
278 echo
279 netstat -M $VMCORE -N $KERNEL -m
280 echo
282 echo "------------------------------------------------------------------------"
283 echo "netstat -id"
284 echo
285 netstat -M $VMCORE -N $KERNEL -id
286 echo
288 echo "------------------------------------------------------------------------"
289 echo "netstat -anr"
290 echo
291 netstat -M $VMCORE -N $KERNEL -anr
292 echo
294 echo "------------------------------------------------------------------------"
295 echo "netstat -anA"
296 echo
297 netstat -M $VMCORE -N $KERNEL -anA
298 echo
300 echo "------------------------------------------------------------------------"
301 echo "netstat -aL"
302 echo
303 netstat -M $VMCORE -N $KERNEL -aL
304 echo
306 echo "------------------------------------------------------------------------"
307 echo "fstat"
308 echo
309 fstat -M $VMCORE -N $KERNEL
310 echo
312 echo "------------------------------------------------------------------------"
313 echo "dmesg"
314 echo
315 dmesg -a -M $VMCORE -N $KERNEL
316 echo
318 #echo "------------------------------------------------------------------------"
319 #echo "kernel config"
320 #echo
321 #config -x $KERNEL