+bin/java_error-findaddr
authorJan Kratochvil <jan@jankratochvil.net>
Mon, 30 May 2022 15:19:44 +0000 (17:19 +0200)
committerJan Kratochvil <jan@jankratochvil.net>
Mon, 30 May 2022 15:19:44 +0000 (17:19 +0200)
bin/java_error-findaddr [new file with mode: 0755]

diff --git a/bin/java_error-findaddr b/bin/java_error-findaddr
new file mode 100755 (executable)
index 0000000..c8f62c6
--- /dev/null
@@ -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 $/; <F>; };
+  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;
+}