2011-04-18 02:34:27     checkstack.pl for checking the stack size

Document created by Aaronwu Employee on Aug 26, 2013
Version 1Show Document
  • View in full screen mode

2011-04-18 02:34:27     checkstack.pl for checking the stack size

Mahalakshmi M (INDIA)

Message: 99932   

 

I am working in 2009R1_RC1 distribution.

 

Can i use "linux-2.6.x/scripts/checkstack.pl" for checking the stack size of my application.

 

If so kindly let me the procedure for using this.

QuoteReplyEditDelete

 

 

2011-04-18 02:43:22     Re: checkstack.pl for checking the stack size

Mike Frysinger (UNITED STATES)

Message: 99933   

 

no, that isnt what it is for

QuoteReplyEditDelete

 

 

2011-04-18 03:29:57     Re: checkstack.pl for checking the stack size

Mahalakshmi M (INDIA)

Message: 99934   

 

Thanks Mike.

 

 

I have tried the following.

 

Created a project with File1.c,checkstack.pl and Makefile.

 

File1.c

 

#include <stdio.h>

int blort()

{

        char bar[10000];

        return bar[0] + bar[9999];

}

int main(int argc, char **argv)

{

        int i;

        char foo[2417],a= 'a';

        foo[0] = (char) blort();

        return 0;

}

 

Makefile

 

#CC=bfin-linux-uclibc-gcc #Not supported

CC=gcc                              #Supported

EXEC=test

OBJS=main.o

all:$(EXEC)

$(EXEC):$(OBJS)

        $(CC)$(LDFLAG) -o $@ $(OBJS)$(LDLIBS) -lpthread -L .

romfs:

                $(ROMFINST)     /bin/$(EXEC)

clean:

                rm -f $(EXEC)* *.elf *.gdb *.o

 

 

checkstack.pl

 

my (@stack, $re, $x, $xs);

{

        my $arch = shift;

        if ($arch eq "") {

                $arch = `uname -m`;

        }

 

        $x      = "[0-9a-f]";   # hex character

        $xs     = "[0-9a-f ]";  # hex character or space

        if ($arch eq 'arm') {

                #c0008ffc:      e24dd064        sub     sp, sp, #100    ; 0x64

                $re = qr/.*sub.*sp, sp, #(([0-9]{2}|[3-9])[0-9]{2})/o;

        }

elsif ($arch =~ /^i[3456]86$/) {

print(" i686 \n");

                #c0105234:       81 ec ac 05 00 00       sub    $0x5ac,%esp

                $re = qr/^.*[as][du][db]    \$(0x$x{1,8}),\%esp$/o;

        } elsif ($arch eq 'x86_64') {

                #    2f60:      48 81 ec e8 05 00 00    sub    $0x5e8,%rsp

                $re = qr/^.*[as][du][db]    \$(0x$x{1,8}),\%rsp$/o;

        } elsif ($arch eq 'ia64') {

                #e0000000044011fc:       01 0f fc 8c     adds r12=-384,r12

                $re = qr/.*adds.*r12=-(([0-9]{2}|[3-9])[0-9]{2}),r12/o;

        } elsif ($arch eq 'm68k') {

                #    2b6c:       4e56 fb70       linkw %fp,#-1168

                #  1df770:       defc ffe4       addaw #-28,%sp

                $re = qr/.*(?:linkw %fp,|addaw )#-([0-9]{1,4})(?:,%sp)?$/o;

        } elsif ($arch eq 'mips64') {

                #8800402c:       67bdfff0        daddiu  sp,sp,-16

                $re = qr/.*daddiu.*sp,sp,-(([0-9]{2}|[3-9])[0-9]{2})/o;

        } elsif ($arch eq 'mips') {

                #88003254:       27bdffe0        addiu   sp,sp,-32

                $re = qr/.*addiu.*sp,sp,-(([0-9]{2}|[3-9])[0-9]{2})/o;

        } elsif ($arch eq 'ppc') {

                #c00029f4:       94 21 ff 30     stwu    r1,-208(r1)

                $re = qr/.*stwu.*r1,-($x{1,8})\(r1\)/o;

        } elsif ($arch eq 'ppc64') {

 

#XXX

                $re = qr/.*stdu.*r1,-($x{1,8})\(r1\)/o;

        } 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;

        } elsif ($arch =~ /^sh64$/) {

                #XXX: we only check for the immediate case presently,

                #     though we will want to check for the movi/sub

                #     pair for larger users. -- PFM.

                #a00048e0:       d4fc40f0        addi.l  r15,-240,r15

                $re = qr/.*addi\.l.*r15,-(([0-9]{2}|[3-9])[0-9]{2}),r15/o;

        } else {

                print("Hi wrong or unknown architecture\n");

                exit

        }

}

 

sub bysize($) {

        my ($asize, $bsize);

        ($asize = $a) =~ s/.*:  *(.*)$/$1/;

        ($bsize = $b) =~ s/.*:  *(.*)$/$1/;

        $bsize <=> $asize

}

 

#

# main()

#

my $funcre = qr/^$x* <(.*)>:$/;

my $func;

my $file, $lastslash;

 

while (my $line = <STDIN>) {

        if ($line =~ m/$funcre/) {

                $func = $1;

        }

        elsif ($line =~ m/(.*):\s*file format/) {

                $file = $1;

                $file =~ s/\.ko//;

                $lastslash = rindex($file, "/");

                if ($lastslash != -1) {

                        $file = substr($file, $lastslash + 1);

                }

        }

        elsif ($line =~ m/$re/) {

                my $size = $1;

                $size = hex($size) if ($size =~ /^0x/);

 

                if ($size > 0xf0000000) {

                        $size = - $size;

                        $size += 0x80000000;

                        $size += 0x80000000;

                }

                next if ($size > 0x10000000);

 

                next if $line !~ m/^($xs*)/;

                my $addr = $1;

                $addr =~ s/ /0/g;

                $addr = "0x$addr";

 

                my $intro = "$addr $func [$file]:";

                my $padlen = 56 - length($intro);

                while ($padlen > 0) {

                        $intro .= '     ';

                        $padlen -= 8;

                }

                next if ($size < 100);

                push @stack, "$intro$size\n";

        }

}

print sort bysize @stack;

 

Then i typed the following command

objdump -d test | perl 1.pl i686

 

Output:

 

0x08048457 blort [test]:                                10000

0x08048481 main [test]:                                 2436

0x080484a7 main [test]:                                 2436

 

 

That is the stack used by the functions in main.c.This result is obtained by compiling using gcc.

 

I tried to compile the same using bfin-linux-uclibc-gcc and i got error.Am i doing anything wrong? Please provide ur views.

QuoteReplyEditDelete

 

 

2011-04-18 03:51:15     Re: checkstack.pl for checking the stack size

Mike Frysinger (UNITED STATES)

Message: 99935   

 

checkstack only extracts the stack usage for individual functions (and it isnt exact all the time).  it has no idea the total stack usage as functions call each other, nor can it track trickier stack usage that the compiler sometimes generates.

QuoteReplyEditDelete

 

 

2011-04-18 05:10:36     Re: checkstack.pl for checking the stack size

Mahalakshmi M (INDIA)

Message: 99939   

 

Thanks a lot for clarifying Mike.

Attachments

    Outcomes