136a3d1d6SAlex Hornung#!/bin/sh 236a3d1d6SAlex Hornung# 336a3d1d6SAlex Hornung# Copyright (c) 2008 Yahoo!, Inc. 436a3d1d6SAlex Hornung# All rights reserved. 536a3d1d6SAlex Hornung# 636a3d1d6SAlex Hornung# Redistribution and use in source and binary forms, with or without 736a3d1d6SAlex Hornung# modification, are permitted provided that the following conditions 836a3d1d6SAlex Hornung# are met: 936a3d1d6SAlex Hornung# 1. Redistributions of source code must retain the above copyright 1036a3d1d6SAlex Hornung# notice, this list of conditions and the following disclaimer. 1136a3d1d6SAlex Hornung# 2. Redistributions in binary form must reproduce the above copyright 1236a3d1d6SAlex Hornung# notice, this list of conditions and the following disclaimer in the 1336a3d1d6SAlex Hornung# documentation and/or other materials provided with the distribution. 1436a3d1d6SAlex Hornung# 3. Neither the name of the author nor the names of any co-contributors 1536a3d1d6SAlex Hornung# may be used to endorse or promote products derived from this software 1636a3d1d6SAlex Hornung# without specific prior written permission. 1736a3d1d6SAlex Hornung# 1836a3d1d6SAlex Hornung# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1936a3d1d6SAlex Hornung# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2036a3d1d6SAlex Hornung# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2136a3d1d6SAlex Hornung# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2236a3d1d6SAlex Hornung# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2336a3d1d6SAlex Hornung# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2436a3d1d6SAlex Hornung# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2536a3d1d6SAlex Hornung# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2636a3d1d6SAlex Hornung# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2736a3d1d6SAlex Hornung# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2836a3d1d6SAlex Hornung# SUCH DAMAGE. 2936a3d1d6SAlex Hornung# 3036a3d1d6SAlex Hornung# $FreeBSD$ 3136a3d1d6SAlex Hornung 3236a3d1d6SAlex Hornungusage() 3336a3d1d6SAlex Hornung{ 3436a3d1d6SAlex Hornung echo "usage: crashinfo [-d crashdir] [-n dumpnr] [-k kernel] [core]" 3536a3d1d6SAlex Hornung exit 1 3636a3d1d6SAlex Hornung} 3736a3d1d6SAlex Hornung 3836a3d1d6SAlex Hornungfind_kernel() 3936a3d1d6SAlex Hornung{ 4036a3d1d6SAlex Hornung local ivers k kvers file 4136a3d1d6SAlex Hornung 4236a3d1d6SAlex Hornung ivers=$(awk ' 4336a3d1d6SAlex Hornung /Version String/ { 4436a3d1d6SAlex Hornung print 4536a3d1d6SAlex Hornung nextline=1 4636a3d1d6SAlex Hornung next 4736a3d1d6SAlex Hornung } 4836a3d1d6SAlex Hornung // { 4936a3d1d6SAlex Hornung if (nextline) { 5036a3d1d6SAlex Hornung print 5136a3d1d6SAlex Hornung nextline=0 5236a3d1d6SAlex Hornung } 5336a3d1d6SAlex Hornung }' $INFO) 5436a3d1d6SAlex Hornung 5536a3d1d6SAlex Hornung file=`mktemp /tmp/crashinfo.XXXXXX` 5636a3d1d6SAlex Hornung if [ $? -eq 0 ]; then 5736a3d1d6SAlex Hornung echo 'printf " Version String: %s", version' > $file 5836a3d1d6SAlex Hornung # Look for a matching kernel version. 5936a3d1d6SAlex Hornung for k in /boot/kernel/kernel $(ls -t $CRASHDIR/kern.*) $(ls -t /boot/*/kernel); do 6036a3d1d6SAlex Hornung kvers=$(gdb -x $file -batch $k 2>/dev/null) 6136a3d1d6SAlex Hornung if [ "$ivers" = "$kvers" ]; then 6236a3d1d6SAlex Hornung KERNEL=$k 6336a3d1d6SAlex Hornung KVERS=$kvers 6436a3d1d6SAlex Hornung break 6536a3d1d6SAlex Hornung fi 6636a3d1d6SAlex Hornung done 6736a3d1d6SAlex Hornung rm -f $file 6836a3d1d6SAlex Hornung fi 6936a3d1d6SAlex Hornung} 7036a3d1d6SAlex Hornung 7136a3d1d6SAlex HornungCRASHDIR=/var/crash 7236a3d1d6SAlex HornungDUMPNR= 7336a3d1d6SAlex HornungKERNEL= 7436a3d1d6SAlex HornungKVERS= 7536a3d1d6SAlex Hornung 7636a3d1d6SAlex Hornungwhile getopts "d:n:k:" opt; do 7736a3d1d6SAlex Hornung case "$opt" in 7836a3d1d6SAlex Hornung d) 7936a3d1d6SAlex Hornung CRASHDIR=$OPTARG 8036a3d1d6SAlex Hornung ;; 8136a3d1d6SAlex Hornung n) 8236a3d1d6SAlex Hornung DUMPNR=$OPTARG 8336a3d1d6SAlex Hornung ;; 8436a3d1d6SAlex Hornung k) 8536a3d1d6SAlex Hornung KERNEL=$OPTARG 8636a3d1d6SAlex Hornung ;; 8736a3d1d6SAlex Hornung \?) 8836a3d1d6SAlex Hornung usage 8936a3d1d6SAlex Hornung ;; 9036a3d1d6SAlex Hornung esac 9136a3d1d6SAlex Hornungdone 9236a3d1d6SAlex Hornung 9336a3d1d6SAlex Hornungshift $((OPTIND - 1)) 9436a3d1d6SAlex Hornung 9536a3d1d6SAlex Hornungif [ $# -eq 1 ]; then 9636a3d1d6SAlex Hornung if [ -n "$DUMPNR" ]; then 9736a3d1d6SAlex Hornung echo "-n and an explicit vmcore are mutually exclusive" 9836a3d1d6SAlex Hornung usage 9936a3d1d6SAlex Hornung fi 10036a3d1d6SAlex Hornung 10136a3d1d6SAlex Hornung # Figure out the crash directory and number from the vmcore name. 10236a3d1d6SAlex Hornung CRASHDIR=`dirname $1` 10336a3d1d6SAlex Hornung DUMPNR=$(expr $(basename $1) : 'vmcore\.\([0-9]*\)$') 10436a3d1d6SAlex Hornung if [ -z "$DUMPNR" ]; then 10536a3d1d6SAlex Hornung echo "Unable to determine dump number from vmcore file $1." 10636a3d1d6SAlex Hornung exit 1 10736a3d1d6SAlex Hornung fi 10836a3d1d6SAlex Hornungelif [ $# -gt 1 ]; then 10936a3d1d6SAlex Hornung usage 11036a3d1d6SAlex Hornungelse 11136a3d1d6SAlex Hornung # If we don't have an explicit dump number, operate on the most 11236a3d1d6SAlex Hornung # recent dump. 11336a3d1d6SAlex Hornung if [ -z "$DUMPNR" ]; then 11436a3d1d6SAlex Hornung if ! [ -r $CRASHDIR/bounds ]; then 11536a3d1d6SAlex Hornung echo "No crash dumps in $CRASHDIR." 11636a3d1d6SAlex Hornung exit 1 11736a3d1d6SAlex Hornung fi 11836a3d1d6SAlex Hornung next=`cat $CRASHDIR/bounds` 11936a3d1d6SAlex Hornung if [ -z "$next" ] || [ "$next" -eq 0 ]; then 12036a3d1d6SAlex Hornung echo "No crash dumps in $CRASHDIR." 12136a3d1d6SAlex Hornung exit 1 12236a3d1d6SAlex Hornung fi 12336a3d1d6SAlex Hornung DUMPNR=$(($next - 1)) 12436a3d1d6SAlex Hornung fi 12536a3d1d6SAlex Hornungfi 12636a3d1d6SAlex Hornung 12736a3d1d6SAlex HornungVMCORE=$CRASHDIR/vmcore.$DUMPNR 12836a3d1d6SAlex HornungINFO=$CRASHDIR/info.$DUMPNR 12936a3d1d6SAlex HornungFILE=$CRASHDIR/core.txt.$DUMPNR 13036a3d1d6SAlex HornungHOSTNAME=`hostname` 13136a3d1d6SAlex Hornung 13236a3d1d6SAlex Hornungif [ ! -e $VMCORE ]; then 13336a3d1d6SAlex Hornung echo "$VMCORE not found" 13436a3d1d6SAlex Hornung exit 1 13536a3d1d6SAlex Hornungfi 13636a3d1d6SAlex Hornung 13736a3d1d6SAlex Hornungif [ ! -e $INFO ]; then 13836a3d1d6SAlex Hornung echo "$INFO not found" 13936a3d1d6SAlex Hornung exit 1 14036a3d1d6SAlex Hornungfi 14136a3d1d6SAlex Hornung 14236a3d1d6SAlex Hornung# If the user didn't specify a kernel, then try to find one. 14336a3d1d6SAlex Hornungif [ -z "$KERNEL" ]; then 14436a3d1d6SAlex Hornung find_kernel 14536a3d1d6SAlex Hornung if [ -z "$KERNEL" ]; then 14636a3d1d6SAlex Hornung echo "Unable to find matching kernel for $VMCORE" 14736a3d1d6SAlex Hornung exit 1 14836a3d1d6SAlex Hornung fi 14936a3d1d6SAlex Hornungelif [ ! -e $KERNEL ]; then 15036a3d1d6SAlex Hornung echo "$KERNEL not found" 15136a3d1d6SAlex Hornung exit 1 15236a3d1d6SAlex Hornungfi 15336a3d1d6SAlex Hornung 15436a3d1d6SAlex Hornungecho "Writing crash summary to $FILE." 15536a3d1d6SAlex Hornung 15636a3d1d6SAlex Hornung# Simulate uname 15736a3d1d6SAlex Hornung#ostype=$(echo -e printf '"%s", ostype' | gdb -x /dev/stdin -batch $KERNEL) 15836a3d1d6SAlex Hornung#osrelease=$(echo -e printf '"%s", osrelease' | gdb -x /dev/stdin -batch $KERNEL) 15936a3d1d6SAlex Hornung#version=$(echo -e printf '"%s", version' | gdb -x /dev/stdin -batch $KERNEL | \ 16036a3d1d6SAlex Hornung# tr '\t\n' ' ') 16136a3d1d6SAlex Hornung#machine=$(echo -e printf '"%s", machine' | gdb -x /dev/stdin -batch $KERNEL) 16236a3d1d6SAlex Hornung 16336a3d1d6SAlex Hornungexec > $FILE 2>&1 16436a3d1d6SAlex Hornung 16536a3d1d6SAlex Hornungecho "$HOSTNAME dumped core - see $VMCORE" 16636a3d1d6SAlex Hornungecho 16736a3d1d6SAlex Hornungdate 16836a3d1d6SAlex Hornungecho 16936a3d1d6SAlex Hornung#echo "$ostype $HOSTNAME $osrelease $version $machine" 17036a3d1d6SAlex Hornungecho $KVERS 17136a3d1d6SAlex Hornungecho 17236a3d1d6SAlex Hornungsed -ne '/^ Panic String: /{s//panic: /;p;}' $INFO 17336a3d1d6SAlex Hornungecho 17436a3d1d6SAlex Hornung 17536a3d1d6SAlex Hornung# XXX: /bin/sh on 7.0+ is broken so we can't simply pipe the commands to 17636a3d1d6SAlex Hornung# kgdb via stdin and have to use a temporary file instead. 17736a3d1d6SAlex Hornungfile=`mktemp /tmp/crashinfo.XXXXXX` 17836a3d1d6SAlex Hornungif [ $? -eq 0 ]; then 17936a3d1d6SAlex Hornung echo "bt" >> $file 1801f8a7fecSSascha Wildner echo "source /usr/share/misc/gdbinit" >> $file 181b58087dcSAlex Hornung echo "lstok" >> $file 18236a3d1d6SAlex Hornung echo "psx" >> $file 18336a3d1d6SAlex Hornung echo "running_threads" >> $file 18436a3d1d6SAlex Hornung echo "lsvfs" >> $file 18536a3d1d6SAlex Hornung echo "lsvfsops" >> $file 18636a3d1d6SAlex Hornung echo "lsmount" >> $file 187b58087dcSAlex Hornung echo "kldstat" >> $file 18836a3d1d6SAlex Hornung echo "quit" >> $file 189f6061ce2SAlex Hornung ( ulimit -t 15; cat $file | kgdb $KERNEL $VMCORE ) 19036a3d1d6SAlex Hornung rm -f $file 19136a3d1d6SAlex Hornung echo 19236a3d1d6SAlex Hornungfi 19336a3d1d6SAlex Hornungecho 19436a3d1d6SAlex Hornung 19536a3d1d6SAlex Hornungecho "------------------------------------------------------------------------" 196*cfd1aba3SSascha Wildnerecho "ps -axlwR" 19736a3d1d6SAlex Hornungecho 198*cfd1aba3SSascha Wildnerps -M $VMCORE -N $KERNEL -axlwR 19936a3d1d6SAlex Hornungecho 20036a3d1d6SAlex Hornung 20136a3d1d6SAlex Hornungecho "------------------------------------------------------------------------" 20236a3d1d6SAlex Hornungecho "vmstat -s" 20336a3d1d6SAlex Hornungecho 20436a3d1d6SAlex Hornungvmstat -M $VMCORE -N $KERNEL -s 20536a3d1d6SAlex Hornungecho 20636a3d1d6SAlex Hornung 20736a3d1d6SAlex Hornungecho "------------------------------------------------------------------------" 20836a3d1d6SAlex Hornungecho "vmstat -m" 20936a3d1d6SAlex Hornungecho 21036a3d1d6SAlex Hornungvmstat -M $VMCORE -N $KERNEL -m 21136a3d1d6SAlex Hornungecho 21236a3d1d6SAlex Hornung 21336a3d1d6SAlex Hornungecho "------------------------------------------------------------------------" 21436a3d1d6SAlex Hornungecho "vmstat -z" 21536a3d1d6SAlex Hornungecho 21636a3d1d6SAlex Hornungvmstat -M $VMCORE -N $KERNEL -z 21736a3d1d6SAlex Hornungecho 21836a3d1d6SAlex Hornung 21936a3d1d6SAlex Hornungecho "------------------------------------------------------------------------" 22036a3d1d6SAlex Hornungecho "vmstat -i" 22136a3d1d6SAlex Hornungecho 22236a3d1d6SAlex Hornungvmstat -M $VMCORE -N $KERNEL -i 22336a3d1d6SAlex Hornungecho 22436a3d1d6SAlex Hornung 22536a3d1d6SAlex Hornungecho "------------------------------------------------------------------------" 22636a3d1d6SAlex Hornungecho "pstat -T" 22736a3d1d6SAlex Hornungecho 22836a3d1d6SAlex Hornungpstat -M $VMCORE -N $KERNEL -T 22936a3d1d6SAlex Hornungecho 23036a3d1d6SAlex Hornung 23136a3d1d6SAlex Hornungecho "------------------------------------------------------------------------" 23236a3d1d6SAlex Hornungecho "pstat -s" 23336a3d1d6SAlex Hornungecho 23436a3d1d6SAlex Hornungpstat -M $VMCORE -N $KERNEL -s 23536a3d1d6SAlex Hornungecho 23636a3d1d6SAlex Hornung 23736a3d1d6SAlex Hornung#echo "------------------------------------------------------------------------" 23836a3d1d6SAlex Hornung#echo "iostat" 23936a3d1d6SAlex Hornung#echo 24036a3d1d6SAlex Hornung#iostat -M $VMCORE -N $KERNEL 24136a3d1d6SAlex Hornung#echo 24236a3d1d6SAlex Hornung 24336a3d1d6SAlex Hornungecho "------------------------------------------------------------------------" 24436a3d1d6SAlex Hornungecho "ipcs -a" 24536a3d1d6SAlex Hornungecho 24636a3d1d6SAlex Hornungipcs -C $VMCORE -N $KERNEL -a 24736a3d1d6SAlex Hornungecho 24836a3d1d6SAlex Hornung 24936a3d1d6SAlex Hornungecho "------------------------------------------------------------------------" 25036a3d1d6SAlex Hornungecho "ipcs -T" 25136a3d1d6SAlex Hornungecho 25236a3d1d6SAlex Hornungipcs -C $VMCORE -N $KERNEL -T 25336a3d1d6SAlex Hornungecho 25436a3d1d6SAlex Hornung 25536a3d1d6SAlex Hornung# XXX: This doesn't actually work in 5.x+ 25636a3d1d6SAlex Hornungif false; then 25736a3d1d6SAlex Hornungecho "------------------------------------------------------------------------" 25836a3d1d6SAlex Hornungecho "w -dn" 25936a3d1d6SAlex Hornungecho 26036a3d1d6SAlex Hornungw -M $VMCORE -N $KERNEL -dn 26136a3d1d6SAlex Hornungecho 26236a3d1d6SAlex Hornungfi 26336a3d1d6SAlex Hornung 26436a3d1d6SAlex Hornungecho "------------------------------------------------------------------------" 26536a3d1d6SAlex Hornungecho "nfsstat" 26636a3d1d6SAlex Hornungecho 26736a3d1d6SAlex Hornungnfsstat -M $VMCORE -N $KERNEL 26836a3d1d6SAlex Hornungecho 26936a3d1d6SAlex Hornung 27036a3d1d6SAlex Hornungecho "------------------------------------------------------------------------" 27136a3d1d6SAlex Hornungecho "netstat -s" 27236a3d1d6SAlex Hornungecho 27336a3d1d6SAlex Hornungnetstat -M $VMCORE -N $KERNEL -s 27436a3d1d6SAlex Hornungecho 27536a3d1d6SAlex Hornung 27636a3d1d6SAlex Hornungecho "------------------------------------------------------------------------" 27736a3d1d6SAlex Hornungecho "netstat -m" 27836a3d1d6SAlex Hornungecho 27936a3d1d6SAlex Hornungnetstat -M $VMCORE -N $KERNEL -m 28036a3d1d6SAlex Hornungecho 28136a3d1d6SAlex Hornung 28236a3d1d6SAlex Hornungecho "------------------------------------------------------------------------" 28336a3d1d6SAlex Hornungecho "netstat -id" 28436a3d1d6SAlex Hornungecho 28536a3d1d6SAlex Hornungnetstat -M $VMCORE -N $KERNEL -id 28636a3d1d6SAlex Hornungecho 28736a3d1d6SAlex Hornung 28836a3d1d6SAlex Hornungecho "------------------------------------------------------------------------" 28936a3d1d6SAlex Hornungecho "netstat -anr" 29036a3d1d6SAlex Hornungecho 29136a3d1d6SAlex Hornungnetstat -M $VMCORE -N $KERNEL -anr 29236a3d1d6SAlex Hornungecho 29336a3d1d6SAlex Hornung 29436a3d1d6SAlex Hornungecho "------------------------------------------------------------------------" 29536a3d1d6SAlex Hornungecho "netstat -anA" 29636a3d1d6SAlex Hornungecho 29736a3d1d6SAlex Hornungnetstat -M $VMCORE -N $KERNEL -anA 29836a3d1d6SAlex Hornungecho 29936a3d1d6SAlex Hornung 30036a3d1d6SAlex Hornungecho "------------------------------------------------------------------------" 30136a3d1d6SAlex Hornungecho "netstat -aL" 30236a3d1d6SAlex Hornungecho 30336a3d1d6SAlex Hornungnetstat -M $VMCORE -N $KERNEL -aL 30436a3d1d6SAlex Hornungecho 30536a3d1d6SAlex Hornung 30636a3d1d6SAlex Hornungecho "------------------------------------------------------------------------" 30736a3d1d6SAlex Hornungecho "fstat" 30836a3d1d6SAlex Hornungecho 30936a3d1d6SAlex Hornungfstat -M $VMCORE -N $KERNEL 31036a3d1d6SAlex Hornungecho 31136a3d1d6SAlex Hornung 31236a3d1d6SAlex Hornungecho "------------------------------------------------------------------------" 31336a3d1d6SAlex Hornungecho "dmesg" 31436a3d1d6SAlex Hornungecho 31536a3d1d6SAlex Hornungdmesg -a -M $VMCORE -N $KERNEL 31636a3d1d6SAlex Hornungecho 31736a3d1d6SAlex Hornung 31836a3d1d6SAlex Hornung#echo "------------------------------------------------------------------------" 31936a3d1d6SAlex Hornung#echo "kernel config" 32036a3d1d6SAlex Hornung#echo 32136a3d1d6SAlex Hornung#config -x $KERNEL 322