diff --git a/scripts/process_stack_dump.pl b/scripts/process_stack_dump.pl new file mode 100755 index 0000000000000000000000000000000000000000..5a1922e1ff583606b54bc41d467b8f228ca8c412 --- /dev/null +++ b/scripts/process_stack_dump.pl @@ -0,0 +1,92 @@ +#!/usr/local/bin/perl -w + +use strict; +use warnings; + +use Getopt::Long; + +my $nm = 'nm'; +my $zmap_location = 'zmap'; +my $stack = '-'; +my $usage = sub { exit(exec('perldoc', $0)) }; + +GetOptions( + 'nm=s' => \$nm, + 'zmap=s' => \$zmap_location, + 'stack=s' => \$stack, + 'help' => $usage, + ) or $usage->(); + +my $symbol_address_to_name = produce_symbol_hash($nm, $zmap_location, {}); + +open(my $fh, "$stack") || die "Failed to open $stack"; + +while(<$fh>){ + if(/([^\(]*zmap)(.*)?\[(0x([0-9a-f]+))\]/){ + my $address = $3; + my $saved = $address; + my $f_name = ''; + while(!($f_name = $symbol_address_to_name->{$address})){ + $address = spin_back($address); + } + print "$1 [$saved] $f_name ($address)\n"; + }else{ + print; + } +} + +close($fh); + +sub spin_back{ + my $address = oct($_[0]); + $address--; + $address = sprintf("0x%x", $address); + #print $address. "\n"; + return $address; +} + +sub produce_symbol_hash{ + my ($nm, $zmap, $symbol_hash) = @_; + my $cmd = "$nm -ve $zmap"; + + open(my $fh, "$cmd |") || die "Failed to run $cmd"; + + while(<$fh>){ + my @line = split(); + if(@line == 3){ + $line[0] =~ s/^0//; + #print "0x$line[0] - $line[2]\n"; + $symbol_hash->{'0x'.$line[0]} = $line[2]; + }elsif(@line == 2){ + # no symbol address... ignore + } + } + + close ($fh); + + return $symbol_hash; +} + +=pod + +=head1 process_stack_dump + + script to process a stack dump produced by GNU glibc + backtrace_symbols_fd function. + +=head1 DESCRIPTION + + GNU glibc provides a function to print a stack trace to a fd + (backtrace_symbols_fd). This function attempts to lookup the name + of the function at the address in the stack. However, it is + unable to find static functions. This is when this script helps. + +=head1 USAGE + + process_stack_dump.pl [options] + + -nm Path to nm program + -zmap Path to the zmap to proccess + -stack Path to file with stack dump in. + +=cut