--- /dev/null
+#! /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;
+}