[lkml]   [2002]   [Aug]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
SubjectRe: Functions with Large Stack Usage
On 27 Aug 2002 14:08:24 -0400, 
Danny Cox <> wrote:
> After having read of the stack overflow "issues" awhile back, a couple
>of ideas gelled, with this script as a result. The script finds
>functions that use a large (changeable) amount of stack space. Note:
>it's heuristic, it's static, it only looks at compiled-in functions, and
>says nothing about the dynamic system. It DOES point out functions that
>may (MAY) need to be examined closer.
> How it works: With Keith Owens' KDB patch, one may compile the kernel
>with frame pointers. With the Disassemble::X86 Perl module from CPAN
>it's easy. It requires the vmlinux and files, and for each
>function looks at the first 10 instructions for the 'sub esp,N'. The N
>is the number of bytes of stack used.

No need for frame pointers, or Perl. Run as

kernel.stack vmlinux $(/sbin/modprobe -l)

# Run a compiled ix86 kernel and print large local stack usage.
# />:/{s/[<>:]*//g; h; } On lines that contain '>:' (headings like
# c0100000 <_stext>:), remove <, > and : and hold the line. Identifies
# the procedure and its start address.
# /subl\?.*\$0x[^,][^,][^,].*,%esp/{ Select lines containing
# subl\?...0x...,%esp but only if there are at least 3 digits between 0x and
# ,%esp. These are local stacks of at least 0x100 bytes.
# s/.*$0x\([^,]*\).*/\1/; Extract just the stack adjustment
# /^[89a-f].......$/d; Ignore line with 8 digit offsets that are
# negative. Some compilers adjust the stack on exit, seems to be related
# to goto statements
# G; Append the held line (procedure and start address).
# s/\(.*\)\n.* \(.*\)/\1 \2/; Remove the newline and procedure start
# address. Leaves just stack size and procedure name.
# p; }; Print stack size and procedure name.
# /subl\?.*%.*,%esp/{ Selects adjustment of %esp by register, dynamic
# arrays on stack.
# G; Append the held line (procedure and start address).
# s/\(.*\)\n\(.*\)/Dynamic \2 \1/; Reformat to "Dynamic", procedure
# start address, procedure name and the instruction that adjusts the
# stack, including its offset within the proc.
# p; }; Print the dynamic line.
# Leading spaces in the sed string are required.
objdump --disassemble "$@" | \
sed -ne '/>:/{s/[<>:]*//g; h; }
s/.*\$0x\([^,]*\).*/\1/; /^[89a-f].......$/d; G; s/\(.*\)\n.* \(.*\)/\1 \2/; p; };
/subl\?.*%.*,%esp/{ G; s/\(.*\)\n\(.*\)/Dynamic \2 \1/; p; }; ' | \

To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to
More majordomo info at
Please read the FAQ at

 \ /
  Last update: 2005-03-22 13:22    [W:0.060 / U:3.996 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site