From: Jan Kratochvil Date: Mon, 30 May 2022 15:19:44 +0000 (+0200) Subject: +bin/java_error-findaddr X-Git-Url: https://git.jankratochvil.net/?p=nethome.git;a=commitdiff_plain;h=01813031cd32847d4dc1f26c8eb23255752c7896 +bin/java_error-findaddr --- diff --git a/bin/java_error-findaddr b/bin/java_error-findaddr new file mode 100755 index 0000000..c8f62c6 --- /dev/null +++ b/bin/java_error-findaddr @@ -0,0 +1,50 @@ +#! /usr/bin/perl +use strict; +use warnings; +use bigint qw/hex/; + +my $opt_f=1,shift if ($ARGV[0]||"") eq "-f"; + +sub readfile($) { + my($fname)=@_; + local *F; + open F,$fname or die $fname; + my $F=do { local $/; ; }; + defined $F or die $fname; + close F or die $fname; + return $F; +} +sub fromhex($) { + my($hex)=@_; + $hex=~s/^0x//; + die "Invalid addr: $hex" if $hex!~/^[0-9a-f]+$/i; + return hex $hex; +} + +my $fn=shift; +my $f=readfile $fn; +my @f; +while ($f=~/^(([0-9a-f]+)-([0-9a-f]+) [r-][w-][x-][p-] .*)\r?$/mg) { + my $line =$1; + my $start=fromhex $2; + my $end =fromhex $3; + push @f,[$line,$start,$end]; +} +if (!@ARGV) { + $f=~/^RIP=(0x[^,]*),/m or die "no RIP"; + push @ARGV,$1; + my $stack=($f=~/^Top of Stack:.*?\n(.*?\n)\n/ms)[0] or die "no Top of Stack"; + $stack=~s/^0x.*: *//mg; + push @ARGV,split /\s+/,$stack; +} +for my $arg (@ARGV) { + my $addr=fromhex $arg; + my $found; + for my $ft (@f) { + my $line =$ft->[0]; + my $start=$ft->[1]; + my $end =$ft->[2]; + $found=1,print "$arg: $line\n" if $start<=$addr&&$addr<$end&&(!$opt_f||$line=~/[^ ]$/); + } + print "$arg: -\n" if !$found&&!$opt_f; +}