summaryrefslogtreecommitdiffstats
path: root/usr.sbin/crashinfo
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2016-07-27 17:55:14 +0000
committerjhb <jhb@FreeBSD.org>2016-07-27 17:55:14 +0000
commit8fe5530ed02a06db19bfd09057f0cd59e7108871 (patch)
tree1856196978da469a6e7c6de34159da39fbda9a7f /usr.sbin/crashinfo
parentffa9fc325a05f754c4b9e308380e8cb736fab985 (diff)
downloadFreeBSD-src-8fe5530ed02a06db19bfd09057f0cd59e7108871.zip
FreeBSD-src-8fe5530ed02a06db19bfd09057f0cd59e7108871.tar.gz
MFC 303109: Update crashinfo to work with newer gdb from ports.
If gdb from ports is installed, use it instead of the base system gdb to extract variables from a kernel. Note that base gdb and ports gdb do not support the same options for invoking a single command in batch mode, so a wrapper shell function is used. In addition, prefer kgdb from ports when generating a backtrace if present. PR: 193335 Approved by: re (gjb)
Diffstat (limited to 'usr.sbin/crashinfo')
-rwxr-xr-xusr.sbin/crashinfo/crashinfo.sh35
1 files changed, 27 insertions, 8 deletions
diff --git a/usr.sbin/crashinfo/crashinfo.sh b/usr.sbin/crashinfo/crashinfo.sh
index 3a55e5d..24bd180 100755
--- a/usr.sbin/crashinfo/crashinfo.sh
+++ b/usr.sbin/crashinfo/crashinfo.sh
@@ -35,6 +35,22 @@ usage()
exit 1
}
+# Run a single gdb command against a kernel file in batch mode.
+# The kernel file is specified as the first argument and the command
+# is given in the remaining arguments.
+gdb_command()
+{
+ local k
+
+ k=$1 ; shift
+
+ if [ -x /usr/local/bin/gdb ]; then
+ /usr/local/bin/gdb -batch -ex "$@" $k
+ else
+ echo -e "$@" | /usr/bin/gdb -x /dev/stdin -batch $k
+ fi
+}
+
find_kernel()
{
local ivers k kvers
@@ -55,8 +71,8 @@ find_kernel()
# Look for a matching kernel version.
for k in `sysctl -n kern.bootfile` $(ls -t /boot/*/kernel); do
- kvers=$(echo 'printf " Version String: %s", version' | \
- gdb -x /dev/stdin -batch $k 2>/dev/null)
+ kvers=$(gdb_command $k 'printf " Version String: %s", version' \
+ 2>/dev/null)
if [ "$ivers" = "$kvers" ]; then
KERNEL=$k
break
@@ -151,11 +167,10 @@ echo "Writing crash summary to $FILE."
umask 077
# Simulate uname
-ostype=$(echo -e printf '"%s", ostype' | gdb -x /dev/stdin -batch $KERNEL)
-osrelease=$(echo -e printf '"%s", osrelease' | gdb -x /dev/stdin -batch $KERNEL)
-version=$(echo -e printf '"%s", version' | gdb -x /dev/stdin -batch $KERNEL | \
- tr '\t\n' ' ')
-machine=$(echo -e printf '"%s", machine' | gdb -x /dev/stdin -batch $KERNEL)
+ostype=$(gdb_command $KERNEL 'printf "%s", ostype')
+osrelease=$(gdb_command $KERNEL 'printf "%s", osrelease')
+version=$(gdb_command $KERNEL 'printf "%s", version' | tr '\t\n' ' ')
+machine=$(gdb_command $KERNEL 'printf "%s", machine')
exec > $FILE 2>&1
@@ -174,7 +189,11 @@ file=`mktemp /tmp/crashinfo.XXXXXX`
if [ $? -eq 0 ]; then
echo "bt" >> $file
echo "quit" >> $file
- kgdb $KERNEL $VMCORE < $file
+ if [ -x /usr/local/bin/kgdb ]; then
+ /usr/local/bin/kgdb $KERNEL $VMCORE < $file
+ else
+ kgdb $KERNEL $VMCORE < $file
+ fi
rm -f $file
echo
fi
OpenPOWER on IntegriCloud