From: adilger Date: Sun, 7 Sep 2003 05:24:07 +0000 (+0000) Subject: Update checkstack program, to output more useful "stack_usage function name". X-Git-Tag: v1_7_0_51~2^9~335 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=bcb518ee5944e8e62bea11649a80264f0ccc6481;p=fs%2Flustre-release.git Update checkstack program, to output more useful "stack_usage function name". Add a "make checkstack" target which shows the current "worst offenders" list of stack users, or the difference in this list since the last time that target was run. There is also a "make checkstack-clean" tarket which resets the "saved" stack values so that the stack usage diff doesn't show old items. --- diff --git a/lustre/tests/checkstack.pl b/lustre/tests/checkstack.pl index 9c0d097..1e0b35d 100644 --- a/lustre/tests/checkstack.pl +++ b/lustre/tests/checkstack.pl @@ -1,21 +1,21 @@ #!/usr/bin/perl - # Check the stack usage of functions # # Copyright Joern Engel # Inspired by Linus Torvalds # Original idea maybe from Keith Owens +# s390 port and big speedup by Arnd Bergmann +# Modified to have simpler output format by Dan Kegel # # Usage: -# objdump -d vmlinux | checkstack.pl +# objdump -d vmlinux | stackcheck.pl [arch] # # find -name "*.o" | while read M; do # objdump -d $M | perl ~/checkstack.pl | \ # sed "s/^/`basename $M`: /" ; done | \ # awk '/esp/ { print $5, $2, $4 }' | sort -nr -# + # TODO : Port to all architectures (one regex per arch) -# Speed this puppy up # check for arch # @@ -26,67 +26,49 @@ # # use anything else and feel the pain ;) { - my $arch = shift; + my $arch = `uname -m`; $x = "[0-9a-f]"; # hex character $xs = "[0-9a-f ]"; # hex character or space + if ($arch eq "") { + print "Usage: objdump -d vmlinux | checkstack.pl\n"; + print "where arch is i386, ia64, ppc, or s390\n"; + print "Each output line gives a function's stack usage and name\n"; + print "Lines are output in order of decreasing stack usage\n"; + die "Error: must specify architecture on commandline"; + } if ($arch =~ /^i[3456]86$/) { #c0105234: 81 ec ac 05 00 00 sub $0x5ac,%esp - $re = qr/^.*(sub/s\$(0x$x{3,5}),\%esp)$/o; + $re = qr/^.*(sub \$(0x$x{3,6}),\%esp)$/o; + $todec = sub { return hex($_[0]); }; } elsif ($arch =~ /^ia64$/) { # adds r12=-384,r12 - $re = qr/.*(adds/sr12=-($x{3,5}),r12)/o; + $re = qr/.*(adds.*r12=-($x{3,5}),r12)/o; } elsif ($arch =~ /^ppc$/) { #c00029f4: 94 21 ff 30 stwu r1,-208(r1) - $re = qr/.*(stwu/sr1,-($x{3,5})\(r1\))/o; + $re = qr/.*(stwu.*r1,-($x{3,6})\(r1\))/o; + $todec = sub { return hex($_[0]); }; } elsif ($arch =~ /^s390x?$/) { # 11160: a7 fb ff 60 aghi %r15,-160 $re = qr/.*(ag?hi.*\%r15,-(([0-9]{2}|[3-9])[0-9]{2}))/o; + $todec = sub { return $_[0]; }; } else { - print("wrong or unknown architecture\n"); - exit + die("wrong or unknown architecture\n"); } } -sub bysize($) { - ($asize = $a) =~ s/$re/\2/; - ($bsize = $b) =~ s/$re/\2/; - $bsize <=> $asize -} - -# -# main() -# $funcre = qr/^$x* \<(.*)\>:$/; while ($line = ) { if ($line =~ m/$funcre/) { ($func = $line) =~ s/$funcre/\1/; chomp($func); } - if ($line =~ m/$re/) { - (my $addr = $line) =~ s/^($xs{8}).*/0x\1/o; - chomp($addr); - - my $intro = "$addr $func:"; - my $padlen = 56 - length($intro); - while ($padlen > 0) { - $intro .= ' '; - $padlen -= 8; - } - (my $code = $line) =~ s/$re/\1/; - - $stack[@stack] = "$intro $code"; + push(@stack, &$todec($2)." ".$func); + # don't expect more than one stack allocation per function + $func .= " ** bug **"; } } -@sortedstack = sort bysize @stack; - -foreach $i (@sortedstack) { - print("$i"); +foreach (sort { $b - $a } (@stack)) { + print $_."\n"; } --- -Andreas Dilger -http://sourceforge.net/projects/ext2resize/ -http://www-mddsp.enel.ucalgary.ca/People/adilger/ - -