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 [-d crashdir] [-n dumpnr] [-k kernel] [core]"
55 # Look for a matching kernel version.
56 for k in `sysctl -n kern.bootfile` $(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
70 while getopts "d:n:k:" opt; do
90 if [ -n "$DUMPNR" ]; then
91 echo "-n and an explicit vmcore are mutually exclusive"
95 # Figure out the crash directory and number from the vmcore name.
97 DUMPNR=$(expr $(basename $1) : 'vmcore\.\([0-9]*\)$')
98 if [ -z "$DUMPNR" ]; then
99 echo "Unable to determine dump number from vmcore file $1."
102 elif [ $# -gt 1 ]; then
105 # If we don't have an explicit dump number, operate on the most
107 if [ -z "$DUMPNR" ]; then
108 if ! [ -r $CRASHDIR/bounds ]; then
109 echo "No crash dumps in $CRASHDIR."
112 next=`cat $CRASHDIR/bounds`
113 if [ -z "$next" ] || [ "$next" -eq 0 ]; then
114 echo "No crash dumps in $CRASHDIR."
117 DUMPNR=$(($next - 1))
121 VMCORE=$CRASHDIR/vmcore.$DUMPNR
122 INFO=$CRASHDIR/info.$DUMPNR
123 FILE=$CRASHDIR/core.txt.$DUMPNR
126 if [ ! -e $VMCORE ]; then
127 echo "$VMCORE not found"
131 if [ ! -e $INFO ]; then
132 echo "$INFO not found"
136 # If the user didn't specify a kernel, then try to find one.
137 if [ -z "$KERNEL" ]; then
139 if [ -z "$KERNEL" ]; then
140 echo "Unable to find matching kernel for $VMCORE"
143 elif [ ! -e $KERNEL ]; then
144 echo "$KERNEL not found"
148 echo "Writing crash summary to $FILE."
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 | \
157 machine=$(echo -e printf '"%s", machine' | gdb -x /dev/stdin -batch $KERNEL)
161 echo "$HOSTNAME dumped core - see $VMCORE"
165 echo "$ostype $HOSTNAME $osrelease $version $machine"
167 sed -ne '/^ Panic String: /{s//panic: /;p;}' $INFO
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
176 kgdb $KERNEL $VMCORE < $file
182 echo "------------------------------------------------------------------------"
185 ps -M $VMCORE -N $KERNEL -axl
188 echo "------------------------------------------------------------------------"
191 vmstat -M $VMCORE -N $KERNEL -s
194 echo "------------------------------------------------------------------------"
197 vmstat -M $VMCORE -N $KERNEL -m
200 echo "------------------------------------------------------------------------"
203 vmstat -M $VMCORE -N $KERNEL -z
206 echo "------------------------------------------------------------------------"
209 vmstat -M $VMCORE -N $KERNEL -i
212 echo "------------------------------------------------------------------------"
215 pstat -M $VMCORE -N $KERNEL -T
218 echo "------------------------------------------------------------------------"
221 pstat -M $VMCORE -N $KERNEL -s
224 echo "------------------------------------------------------------------------"
227 iostat -M $VMCORE -N $KERNEL
230 echo "------------------------------------------------------------------------"
233 ipcs -C $VMCORE -N $KERNEL -a
236 echo "------------------------------------------------------------------------"
239 ipcs -C $VMCORE -N $KERNEL -T
242 # XXX: This doesn't actually work in 5.x+
244 echo "------------------------------------------------------------------------"
247 w -M $VMCORE -N $KERNEL -dn
251 echo "------------------------------------------------------------------------"
254 nfsstat -M $VMCORE -N $KERNEL
257 echo "------------------------------------------------------------------------"
260 netstat -M $VMCORE -N $KERNEL -s
263 echo "------------------------------------------------------------------------"
266 netstat -M $VMCORE -N $KERNEL -m
269 echo "------------------------------------------------------------------------"
272 netstat -M $VMCORE -N $KERNEL -idW
275 echo "------------------------------------------------------------------------"
278 netstat -M $VMCORE -N $KERNEL -anr
281 echo "------------------------------------------------------------------------"
284 netstat -M $VMCORE -N $KERNEL -anA
287 echo "------------------------------------------------------------------------"
290 netstat -M $VMCORE -N $KERNEL -aL
293 echo "------------------------------------------------------------------------"
296 fstat -M $VMCORE -N $KERNEL
299 echo "------------------------------------------------------------------------"
302 dmesg -a -M $VMCORE -N $KERNEL
305 echo "------------------------------------------------------------------------"
311 echo "------------------------------------------------------------------------"
312 echo "ddb capture buffer"
315 ddb capture -M $VMCORE -N $KERNEL print