+bin/java_error-findaddr
[nethome.git] / bin / java_error-findaddr
1 #! /usr/bin/perl
2 use strict;
3 use warnings;
4 use bigint qw/hex/;
5
6 my $opt_f=1,shift if ($ARGV[0]||"") eq "-f";
7
8 sub readfile($) {
9   my($fname)=@_;
10   local *F;
11   open F,$fname or die $fname;
12   my $F=do { local $/; <F>; };
13   defined $F or die $fname;
14   close F or die $fname;
15   return $F;
16 }
17 sub fromhex($) {
18   my($hex)=@_;
19   $hex=~s/^0x//;
20   die "Invalid addr: $hex" if $hex!~/^[0-9a-f]+$/i;
21   return hex $hex;
22 }
23
24 my $fn=shift;
25 my $f=readfile $fn;
26 my @f;
27 while ($f=~/^(([0-9a-f]+)-([0-9a-f]+) [r-][w-][x-][p-] .*)\r?$/mg) {
28   my $line =$1;
29   my $start=fromhex $2;
30   my $end  =fromhex $3;
31   push @f,[$line,$start,$end];
32 }
33 if (!@ARGV) {
34   $f=~/^RIP=(0x[^,]*),/m or die "no RIP";
35   push @ARGV,$1;
36   my $stack=($f=~/^Top of Stack:.*?\n(.*?\n)\n/ms)[0] or die "no Top of Stack";
37   $stack=~s/^0x.*: *//mg;
38   push @ARGV,split /\s+/,$stack;
39 }
40 for my $arg (@ARGV) {
41   my $addr=fromhex $arg;
42   my $found;
43   for my $ft (@f) {
44     my $line =$ft->[0];
45     my $start=$ft->[1];
46     my $end  =$ft->[2];
47     $found=1,print "$arg: $line\n" if $start<=$addr&&$addr<$end&&(!$opt_f||$line=~/[^ ]$/);
48   }
49   print "$arg: -\n" if !$found&&!$opt_f;
50 }