3 # Copyright (c) 2008 Yahoo!, Inc.
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
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
34 echo "usage: crashinfo [-b] [-d crashdir] [-n dumpnr]" \
39 # Find a gdb binary to use and save the value in GDB.
44 for binary in /usr/local/bin/gdb /usr/libexec/gdb /usr/bin/gdb; do
45 if [ -x ${binary} ]; then
52 # Run a single gdb command against a kernel file in batch mode.
53 # The kernel file is specified as the first argument and the command
54 # is given in the remaining arguments.
61 if [ ${GDB} = /usr/local/bin/gdb ]; then
62 ${GDB} -batch -ex "$@" $k
64 echo -e "$@" | ${GDB} -x /dev/stdin -batch $k
79 if ($0 ~ "^ [A-Za-z ]+: ") {
86 # Look for a matching kernel version.
87 for k in `sysctl -n kern.bootfile` $(ls -t /boot/*/kernel); do
88 kvers=$(gdb_command $k 'printf " Version String: %s", version' \
90 if [ "$ivers" = "$kvers" ]; then
102 while getopts "bd:n:k:" opt; do
122 shift $((OPTIND - 1))
124 if [ $# -eq 1 ]; then
125 if [ -n "$DUMPNR" ]; then
126 echo "-n and an explicit vmcore are mutually exclusive"
130 # Figure out the crash directory and number from the vmcore name.
131 CRASHDIR=`dirname $1`
132 DUMPNR=$(expr $(basename $1) : 'vmcore\.\([0-9]*\)$')
133 if [ -z "$DUMPNR" ]; then
134 echo "Unable to determine dump number from vmcore file $1."
137 elif [ $# -gt 1 ]; then
140 # If we don't have an explicit dump number, operate on the most
142 if [ -z "$DUMPNR" ]; then
143 if ! [ -r $CRASHDIR/bounds ]; then
144 echo "No crash dumps in $CRASHDIR."
147 next=`cat $CRASHDIR/bounds`
148 if [ -z "$next" ] || [ "$next" -eq 0 ]; then
149 echo "No crash dumps in $CRASHDIR."
152 DUMPNR=$(($next - 1))
156 VMCORE=$CRASHDIR/vmcore.$DUMPNR
157 INFO=$CRASHDIR/info.$DUMPNR
158 FILE=$CRASHDIR/core.txt.$DUMPNR
162 echo "Writing crash summary to $FILE."
167 if [ -z "$GDB" ]; then
168 echo "Unable to find a kernel debugger."
172 if [ ! -e $VMCORE ]; then
173 echo "$VMCORE not found"
177 if [ ! -e $INFO ]; then
178 echo "$INFO not found"
182 # If the user didn't specify a kernel, then try to find one.
183 if [ -z "$KERNEL" ]; then
185 if [ -z "$KERNEL" ]; then
186 echo "Unable to find matching kernel for $VMCORE"
189 elif [ ! -e $KERNEL ]; then
190 echo "$KERNEL not found"
197 ostype=$(gdb_command $KERNEL 'printf "%s", ostype')
198 osrelease=$(gdb_command $KERNEL 'printf "%s", osrelease')
199 version=$(gdb_command $KERNEL 'printf "%s", version' | tr '\t\n' ' ')
200 machine=$(gdb_command $KERNEL 'printf "%s", machine')
203 echo "Writing crash summary to $FILE."
207 echo "$HOSTNAME dumped core - see $VMCORE"
211 echo "$ostype $HOSTNAME $osrelease $version $machine"
213 sed -ne '/^ Panic String: /{s//panic: /;p;}' $INFO
216 # XXX: /bin/sh on 7.0+ is broken so we can't simply pipe the commands to
217 # kgdb via stdin and have to use a temporary file instead.
218 file=`mktemp /tmp/crashinfo.XXXXXX`
219 if [ $? -eq 0 ]; then
222 ${GDB%gdb}kgdb $KERNEL $VMCORE < $file
228 echo "------------------------------------------------------------------------"
231 ps -M $VMCORE -N $KERNEL -axlww
234 echo "------------------------------------------------------------------------"
237 vmstat -M $VMCORE -N $KERNEL -s
240 echo "------------------------------------------------------------------------"
243 vmstat -M $VMCORE -N $KERNEL -m
246 echo "------------------------------------------------------------------------"
249 vmstat -M $VMCORE -N $KERNEL -z
252 echo "------------------------------------------------------------------------"
255 vmstat -M $VMCORE -N $KERNEL -i
258 echo "------------------------------------------------------------------------"
261 pstat -M $VMCORE -N $KERNEL -T
264 echo "------------------------------------------------------------------------"
267 pstat -M $VMCORE -N $KERNEL -s
270 echo "------------------------------------------------------------------------"
273 iostat -M $VMCORE -N $KERNEL
276 echo "------------------------------------------------------------------------"
279 ipcs -C $VMCORE -N $KERNEL -a
282 echo "------------------------------------------------------------------------"
285 ipcs -C $VMCORE -N $KERNEL -T
288 # XXX: This doesn't actually work in 5.x+
290 echo "------------------------------------------------------------------------"
293 w -M $VMCORE -N $KERNEL -dn
297 echo "------------------------------------------------------------------------"
300 nfsstat -M $VMCORE -N $KERNEL
303 echo "------------------------------------------------------------------------"
306 netstat -M $VMCORE -N $KERNEL -s
309 echo "------------------------------------------------------------------------"
312 netstat -M $VMCORE -N $KERNEL -m
315 echo "------------------------------------------------------------------------"
318 netstat -M $VMCORE -N $KERNEL -anA
321 echo "------------------------------------------------------------------------"
324 netstat -M $VMCORE -N $KERNEL -aL
327 echo "------------------------------------------------------------------------"
330 fstat -M $VMCORE -N $KERNEL
333 echo "------------------------------------------------------------------------"
336 dmesg -a -M $VMCORE -N $KERNEL
339 echo "------------------------------------------------------------------------"
345 echo "------------------------------------------------------------------------"
346 echo "ddb capture buffer"
349 ddb capture -M $VMCORE -N $KERNEL print