home *** CD-ROM | disk | FTP | other *** search
- Newsgroups: comp.sources.misc
- From: Ian Cottam <ian@cs.man.ac.uk>
- Subject: v20i072: pmd - script to improve on "*fault - core dumped", Part01/01
- Message-ID: <1991Jun27.173852.1860@sparky.IMD.Sterling.COM>
- X-Md4-Signature: 6679aea46ec46427d1a6b957fdbf2b35
- Date: Thu, 27 Jun 1991 17:38:52 GMT
- Approved: kent@sparky.imd.sterling.com
-
- Submitted-by: Ian Cottam <ian@cs.man.ac.uk>
- Posting-number: Volume 20, Issue 72
- Archive-name: pmd/part01
- Environment: DBX, UNIX
-
- This is a free, public domain, shell script to run a binary prog and,
- if it dumps core runs the dbx debugger automatically to tell you why.
-
- Ian
- _________________________cut here__________________
- #! /bin/sh
- # This is a shell archive. Remove anything before this line, then feed it
- # into a shell via "sh file" or similar. To overwrite existing files,
- # type "sh file -c".
- # The tool that generated this appeared in the comp.sources.unix newsgroup;
- # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
- # Contents: pmd
- # Wrapped by kent@sparky on Thu Jun 27 11:00:31 1991
- PATH=/bin:/usr/bin:/usr/ucb ; export PATH
- echo If this archive is complete, you will see the following message:
- echo ' "shar: End of archive."'
- if test -f 'pmd' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'pmd'\"
- else
- echo shar: Extracting \"'pmd'\" \(2545 characters\)
- sed "s/^X//" >'pmd' <<'END_OF_FILE'
- X#!/bin/sh
- X#
- X# usage: pmd [-v] prog args...
- X# shell script to run a binary prog and, if it dumps,
- X# runs a debugger to tell you why!
- X# The flag -v means print more verbose explanatory text.
- X#
- X# Ian Cottam, June 91 release 6, friday.
- X# Donated to the public domain :-)
- X
- Xif test $# -eq 0; then
- X echo "`basename $0`: usage: `basename $0` [-v] prog args..." 1>&2 ; exit 1;
- Xfi
- X
- Xif test $1 = "-v"
- Xthen
- X SPEAKUP=1
- X shift
- X if test $# -eq 0; then
- X echo "`basename $0`: usage: `basename $0` [-v] prog args..." 1>&2 ; exit 1;
- X fi
- Xfi
- X
- X# don't be confused by random core files
- Xif test -f core; then rm -f core; fi
- X
- X# execute prog args...
- X$*
- Xif test ! -f core; then exit $?; fi
- X
- X# only do rest of script if prog dumped on us
- X# '\n'
- XNL='
- X'
- X# number of lines to print either side of fault
- XWINDOW=3
- X
- Xtrap "rm -f /tmp/pmd$$; exit 1" 1 2 15
- X
- X# find out how deeply nested we were when fault occured
- X{ echo up 10000; echo quit; } | dbx $1 core 2> /tmp/pmd$$ > /dev/null
- Xread MOVED UP N LEVELS < /tmp/pmd$$
- X
- X# find out what line number, approximately, we crashed at
- X{ echo list; echo quit; } | dbx $1 core 2>/dev/null | sed '1,2d' > /tmp/pmd$$
- Xread LINENO JUNK < /tmp/pmd$$
- Xrm -f /tmp/pmd$$
- X# be careful re occasional junk from dbx
- Xexpr $LINENO + 42 > /dev/null 2>&1
- Xif test $? = 2; then
- X echo "`basename $0`: confused! (was -g given to compiler?), run debugger by hand!" 1>&2
- X exit 1
- Xfi
- X
- Xif test $SPEAKUP; then
- X echo
- X echo Your command "($*)" has aborted.
- X echo A source-related analysis, via dbx\(1\), follows.
- X echo You are cautioned to read the Bugs section of the dbx man page.
- Xfi
- X
- X# sort out line number range to print around fault area
- Xecho "($*) -- fault on or about line $LINENO"
- Xif test $LINENO -le $WINDOW; then LINENO=`expr $WINDOW + 1`; fi
- X
- X# check if crash in main
- Xif test $SPEAKUP; then
- X echo "A few lines either side of the fault line are also printed."
- X if test "$LEVELS" = "top call level"; then
- X echo "The arguments and local variables to main follow."
- X else
- X echo "The arguments and local variables to the offending function follow."
- X echo "Subsequent output shows the call trace back up to main."
- X fi
- Xfi
- X
- X# print for each function level from fault point backwards
- X{ echo file
- X echo func
- X echo list `expr $LINENO - $WINDOW` "," `expr $LINENO + $WINDOW`
- X echo dump
- X if test "$LEVELS" && test "$LEVELS" != "top call level"; then
- X while test $N -ne 0; do
- X echo up; echo file; echo dump
- X N=`expr $N - 1`
- X done
- X fi
- X}| dbx $1 core| sed "1,2d;s/^Current function is/\\${NL}Called from function:/"
- X
- Xexit 0
- END_OF_FILE
- if test 2545 -ne `wc -c <'pmd'`; then
- echo shar: \"'pmd'\" unpacked with wrong size!
- fi
- # end of 'pmd'
- fi
- echo shar: End of archive.
- exit 0
- --
- Ian Cottam, Room IT209, Department of Computer Science,
- University of Manchester, Oxford Road, Manchester, M13 9PL, U.K.
- Tel: (+44) 61-275 6157 FAX: (+44) 61-275-6236
- Internet: ian%cs.man.ac.uk; JANET: ian@uk.ac.man.cs
-
- exit 0 # Just in case...
- --
- Kent Landfield INTERNET: kent@sparky.IMD.Sterling.COM
- Sterling Software, IMD UUCP: uunet!sparky!kent
- Phone: (402) 291-8300 FAX: (402) 291-4362
- Please send comp.sources.misc-related mail to kent@uunet.uu.net.
-