diff options
author | markster <markster@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2004-07-24 14:13:23 +0000 |
---|---|---|
committer | markster <markster@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2004-07-24 14:13:23 +0000 |
commit | 179bdea436913895e66c9ee860ecfa7fcf5cd061 (patch) | |
tree | e417eb91eb9ff2d5b2cb7c4cb13cd2c4b44711d0 | |
parent | 412e325b74cab5ae9b00b6aa104b1c5702489fbd (diff) |
Add "checkstack" for checking stack sizes
git-svn-id: http://svn.digium.com/svn/zaptel/trunk@439 5390a7c7-147a-4af0-8ec9-7488f05a26cb
-rwxr-xr-x | .cvsignore | 1 | ||||
-rwxr-xr-x | Makefile | 3 | ||||
-rwxr-xr-x | checkstack | 46 |
3 files changed, 50 insertions, 0 deletions
@@ -11,6 +11,7 @@ makefw libtonezone.so.1.0 gendigits fxstest +zttest *.ko *.mod.c .*.cmd @@ -217,6 +217,9 @@ fxstest: fxstest.o fxsdump: fxsdump.o $(CC) -o fxsdump fxsdump.o -lm +stackcheck: checkstack $(BUILDVER) + ./checkstack *.o + devices: ifeq ($(DYNFS),) mkdir -p $(INSTALL_PREFIX)/dev/zap diff --git a/checkstack b/checkstack new file mode 100755 index 0000000..7f1fa96 --- /dev/null +++ b/checkstack @@ -0,0 +1,46 @@ +#!/bin/bash +# +# Written by Keith Owens, modified by Arjan van de Ven to output in deciman +# +# Usage : check-stack.sh 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. +# +# first check if it's x86, since only that arch works for now +uname -m | grep -q 86$ > /dev/null || exit +# +objdump --disassemble "$@" | \ +sed -ne '/>:/{s/[<>:]*//g; h; } + /subl\?.*\$0x[^,][^,][^,].*,%esp/{ + s/.*\$0x\([^,]*\).*/\1/; /^[89a-f].......$/d; G; s/\(.*\)\n.* \(.*\)/\1 \2/; p; }; + /subl\?.*%.*,%esp/{ G; s/\(.*\)\n\(.*\)/Dynamic \2 \1/; p; }; ' | \ + sort | \ +perl -e 'while (<>) { if (/^([0-9a-f]+)(.*)/) { $decn = hex("0x" . $1); if ($decn > 400) { print "$decn $2\n";} } }' |