linux-mips
[Top] [All Lists]

Re: Kernel Oops when booting on DECstation

To: Keith Owens <kaos@melbourne.sgi.com>
Subject: Re: Kernel Oops when booting on DECstation
From: Jun Sun <jsun@mvista.com>
Date: Mon, 18 Dec 2000 10:48:52 -0800
Cc: Martin Michlmayr <tbm@cyrius.com>, linux-mips@oss.sgi.com
References: <23987.976979391@ocs3.ocs-net>
Sender: owner-linux-mips@oss.sgi.com
Keith Owens wrote:
> 
> On Sat, 16 Dec 2000 16:00:51 +0100,
> Martin Michlmayr <tbm@cyrius.com> wrote:
> >ksymoops 2.3.5 on i586 2.2.15.  Options used
> >     -a mipsel
> >Using defaults from ksymoops -t elf32-i386
> 
> The joys of cross system debugging.  You need to set ksymoops option
> -t, it is defaulting to elf32-i386 which is no good for mips objects.
> You almost certainly need to set environment variables KSYMOOPS_NM and
> KSYMOOPS_OBJDUMP to point to versions of these programs that understand
> mips.  If mips prints the code in big endian format then you need to
> use ksymoops option -e.  man ksymoops and scan for 'cross'.

Martin,

If you have System.map file, you can use a perl script written by Phil to
decode the trace.

Jun
#!/usr/bin/perl

# call2sym -  convert linux kernel oops call trace listings to System.map
#             symbolic names.
#
# Written by Phil Hollenback
# Copyright (C) 2000 Phil Hollenback <phollenback@pobox.com>
#
# This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference.
# All other rights reserved.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# See the perlpod documentation at the end of this file for
# instructions.
#
# $Id: call2sym,v 1.2 2000/09/28 20:15:59 phil Exp $

#
# Configuration Options
#

# This will be viewable thru the "-v" switch at a later date.
$version = "0.0.1";

#
# End Configuration Options
#

# Check that we got passed a System.map file on the command line.
(scalar(@ARGV) == 1) or $mapfile = "System.map";
(scalar(@ARGV) == 1) and $mapfile = $ARGV[0];

( -r $mapfile ) or die "Can't read file $mapfile\n";

print "Ready for call trace list.  <ctrl-d> on a blank line when done.\n\n";

while (<STDIN>)
  {
    # remove newlines in case this was a cut-n-paste.
    chop;
    $trace_line .= $_;
  }

print "\nProcessing...\n";

# Now munge call trace entries into an array.
@trace_addrs = ();

# Split into an array of addresses, on whitespace.
@trace_addrs = split / /,$trace_line;

# I think I'm clever, so use a map to remove cruft from each array
# entry.
@trace_addrs = map { m|\[<(.*)>\]| } @trace_addrs;

# I now have an in-order array of the call trace addresses.

# Suck the whole mapfile into a hash keyed on address.  Convert keys to
# decimal for easier compares later on.
open MAPFILE, $mapfile or die "Can't open mapfile $mapfile\n";
while (<MAPFILE>)
  {
    if ( /^00000000(.*) . (.*)/ )
      {
        # convert to decimal and pad to 10 digits.
        # that way everything lines up and conversions should be easy.
        $decaddr = sprintf "%010lu", hex($1);
        $funcs{$decaddr} = $2;
      }
  }

# print a header
print "\nAddress\t\tFunction\n\n";

# We've got all the addresses in the hash as string versions of
# decimal numbers. Should now be able to iterate thru the
# list until we find the one closest to each $addr.
foreach $addr (@trace_addrs)
  {
    # convert addr to decimal.
    $decaddr = hex($addr);

    # loop through keys until we find the one just 1 greater.
    foreach $func (sort keys %funcs)
      {
        # now print out the one just 1 less.
        if ($func > $decaddr ) {
          print  "$addr\t$funcs{$lastfunc}\n";
          last;
        }
        $lastfunc = $func;
      }
  }



<Prev in Thread] Current Thread [Next in Thread>