xref: /dflybsd-src/usr.sbin/crashinfo/crashinfo.sh (revision cfd1aba350fa2ce99c296d2e02bf8fb76f8bfa65)
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