summaryrefslogtreecommitdiff
path: root/checkstack
diff options
context:
space:
mode:
authormarkster <markster@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2004-07-24 14:13:23 +0000
committermarkster <markster@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2004-07-24 14:13:23 +0000
commit179bdea436913895e66c9ee860ecfa7fcf5cd061 (patch)
treee417eb91eb9ff2d5b2cb7c4cb13cd2c4b44711d0 /checkstack
parent412e325b74cab5ae9b00b6aa104b1c5702489fbd (diff)
Add "checkstack" for checking stack sizes
git-svn-id: http://svn.digium.com/svn/zaptel/trunk@439 5390a7c7-147a-4af0-8ec9-7488f05a26cb
Diffstat (limited to 'checkstack')
-rwxr-xr-xcheckstack46
1 files changed, 46 insertions, 0 deletions
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";} } }'