]> CyberLeo.Net >> Repos - FreeBSD/releng/8.1.git/blob - usr.sbin/crashinfo/crashinfo.sh
Copy stable/8 to releng/8.1 in preparation for 8.1-RC1.
[FreeBSD/releng/8.1.git] / usr.sbin / crashinfo / crashinfo.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2008 Yahoo!, Inc.
4 # All rights reserved.
5 #
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.
17 #
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.
29 #
30 # $FreeBSD$
31
32 usage()
33 {
34         echo "usage: crashinfo [-d crashdir] [-n dumpnr] [-k kernel] [core]"
35         exit 1
36 }
37
38 find_kernel()
39 {
40         local ivers k kvers
41
42         ivers=$(awk '
43         /Version String/ {
44                 print
45                 nextline=1
46                 next
47         }
48         // {
49                 if (nextline) {
50                         print
51                         nextline=0
52                 }
53         }' $INFO)
54
55         # Look for a matching kernel version.
56         for k in /boot/kernel/kernel $(ls -t /boot/*/kernel); do
57                 kvers=$(echo 'printf "  Version String: %s", version' | \
58                     gdb -x /dev/stdin -batch $k 2>/dev/null)
59                 if [ "$ivers" = "$kvers" ]; then
60                         KERNEL=$k
61                         break
62                 fi
63         done
64 }
65
66 CRASHDIR=/var/crash
67 DUMPNR=
68 KERNEL=
69
70 while getopts "d:n:k:" opt; do
71         case "$opt" in
72         d)
73                 CRASHDIR=$OPTARG
74                 ;;
75         n)
76                 DUMPNR=$OPTARG
77                 ;;
78         k)
79                 KERNEL=$OPTARG
80                 ;;
81         \?)
82                 usage
83                 ;;
84         esac
85 done
86
87 shift $((OPTIND - 1))
88
89 if [ $# -eq 1 ]; then
90         if [ -n "$DUMPNR" ]; then
91                 echo "-n and an explicit vmcore are mutually exclusive"
92                 usage
93         fi
94
95         # Figure out the crash directory and number from the vmcore name.
96         CRASHDIR=`dirname $1`
97         DUMPNR=$(expr $(basename $1) : 'vmcore\.\([0-9]*\)$')
98         if [ -z "$DUMPNR" ]; then
99                 echo "Unable to determine dump number from vmcore file $1."
100                 exit 1
101         fi
102 elif [ $# -gt 1 ]; then
103         usage
104 else
105         # If we don't have an explicit dump number, operate on the most
106         # recent dump.
107         if [ -z "$DUMPNR" ]; then
108                 if ! [ -r $CRASHDIR/bounds ]; then
109                         echo "No crash dumps in $CRASHDIR."
110                         exit 1
111                 fi                      
112                 next=`cat $CRASHDIR/bounds`
113                 if [ -z "$next" ] || [ "$next" -eq 0 ]; then
114                         echo "No crash dumps in $CRASHDIR."
115                         exit 1
116                 fi
117                 DUMPNR=$(($next - 1))
118         fi
119 fi
120
121 VMCORE=$CRASHDIR/vmcore.$DUMPNR
122 INFO=$CRASHDIR/info.$DUMPNR
123 FILE=$CRASHDIR/core.txt.$DUMPNR
124 HOSTNAME=`hostname`
125
126 if [ ! -e $VMCORE ]; then
127         echo "$VMCORE not found"
128         exit 1
129 fi
130
131 if [ ! -e $INFO ]; then
132         echo "$INFO not found"
133         exit 1
134 fi
135
136 # If the user didn't specify a kernel, then try to find one.
137 if [ -z "$KERNEL" ]; then
138         find_kernel
139         if [ -z "$KERNEL" ]; then
140                 echo "Unable to find matching kernel for $VMCORE"
141                 exit 1
142         fi
143 elif [ ! -e $KERNEL ]; then
144         echo "$KERNEL not found"
145         exit 1
146 fi
147
148 echo "Writing crash summary to $FILE."
149
150 umask 077
151
152 # Simulate uname
153 ostype=$(echo -e printf '"%s", ostype' | gdb -x /dev/stdin -batch $KERNEL)
154 osrelease=$(echo -e printf '"%s", osrelease' | gdb -x /dev/stdin -batch $KERNEL)
155 version=$(echo -e printf '"%s", version' | gdb -x /dev/stdin -batch $KERNEL | \
156     tr '\t\n' '  ')
157 machine=$(echo -e printf '"%s", machine' | gdb -x /dev/stdin -batch $KERNEL)
158
159 exec > $FILE 2>&1
160
161 echo "$HOSTNAME dumped core - see $VMCORE"
162 echo
163 date
164 echo
165 echo "$ostype $HOSTNAME $osrelease $version $machine"
166 echo
167 sed -ne '/^  Panic String: /{s//panic: /;p;}' $INFO
168 echo
169
170 # XXX: /bin/sh on 7.0+ is broken so we can't simply pipe the commands to
171 # kgdb via stdin and have to use a temporary file instead.
172 file=`mktemp /tmp/crashinfo.XXXXXX`
173 if [ $? -eq 0 ]; then
174         echo "bt" >> $file
175         echo "quit" >> $file
176         kgdb $KERNEL $VMCORE < $file
177         rm -f $file
178         echo
179 fi
180 echo
181
182 echo "------------------------------------------------------------------------"
183 echo "ps -axl"
184 echo
185 ps -M $VMCORE -N $KERNEL -axl
186 echo
187
188 echo "------------------------------------------------------------------------"
189 echo "vmstat -s"
190 echo
191 vmstat -M $VMCORE -N $KERNEL -s
192 echo
193
194 echo "------------------------------------------------------------------------"
195 echo "vmstat -m"
196 echo
197 vmstat -M $VMCORE -N $KERNEL -m
198 echo
199
200 echo "------------------------------------------------------------------------"
201 echo "vmstat -z"
202 echo
203 vmstat -M $VMCORE -N $KERNEL -z
204 echo
205
206 echo "------------------------------------------------------------------------"
207 echo "vmstat -i"
208 echo
209 vmstat -M $VMCORE -N $KERNEL -i
210 echo
211
212 echo "------------------------------------------------------------------------"
213 echo "pstat -T"
214 echo
215 pstat -M $VMCORE -N $KERNEL -T
216 echo
217
218 echo "------------------------------------------------------------------------"
219 echo "pstat -s"
220 echo
221 pstat -M $VMCORE -N $KERNEL -s
222 echo
223
224 echo "------------------------------------------------------------------------"
225 echo "iostat"
226 echo
227 iostat -M $VMCORE -N $KERNEL
228 echo
229
230 echo "------------------------------------------------------------------------"
231 echo "ipcs -a"
232 echo
233 ipcs -C $VMCORE -N $KERNEL -a
234 echo
235
236 echo "------------------------------------------------------------------------"
237 echo "ipcs -T"
238 echo
239 ipcs -C $VMCORE -N $KERNEL -T
240 echo
241
242 # XXX: This doesn't actually work in 5.x+
243 if false; then
244 echo "------------------------------------------------------------------------"
245 echo "w -dn"
246 echo
247 w -M $VMCORE -N $KERNEL -dn
248 echo
249 fi
250
251 echo "------------------------------------------------------------------------"
252 echo "nfsstat"
253 echo
254 nfsstat -M $VMCORE -N $KERNEL
255 echo
256
257 echo "------------------------------------------------------------------------"
258 echo "netstat -s"
259 echo
260 netstat -M $VMCORE -N $KERNEL -s
261 echo
262
263 echo "------------------------------------------------------------------------"
264 echo "netstat -m"
265 echo
266 netstat -M $VMCORE -N $KERNEL -m
267 echo
268
269 echo "------------------------------------------------------------------------"
270 echo "netstat -id"
271 echo
272 netstat -M $VMCORE -N $KERNEL -id
273 echo
274
275 echo "------------------------------------------------------------------------"
276 echo "netstat -anr"
277 echo
278 netstat -M $VMCORE -N $KERNEL -anr
279 echo
280
281 echo "------------------------------------------------------------------------"
282 echo "netstat -anA"
283 echo
284 netstat -M $VMCORE -N $KERNEL -anA
285 echo
286
287 echo "------------------------------------------------------------------------"
288 echo "netstat -aL"
289 echo
290 netstat -M $VMCORE -N $KERNEL -aL
291 echo
292
293 echo "------------------------------------------------------------------------"
294 echo "fstat"
295 echo
296 fstat -M $VMCORE -N $KERNEL
297 echo
298
299 echo "------------------------------------------------------------------------"
300 echo "dmesg"
301 echo
302 dmesg -a -M $VMCORE -N $KERNEL
303 echo
304
305 echo "------------------------------------------------------------------------"
306 echo "kernel config"
307 echo
308 config -x $KERNEL
309
310 echo
311 echo "------------------------------------------------------------------------"
312 echo "ddb capture buffer"
313 echo
314
315 ddb capture -M $VMCORE -N $KERNEL print