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