Added a python example that will compute which functions in a process are hogging the stack.
git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@163543 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/examples/python/stacks.py b/examples/python/stacks.py
new file mode 100755
index 0000000..7b547f4
--- /dev/null
+++ b/examples/python/stacks.py
@@ -0,0 +1,56 @@
+#!/usr/bin/python
+
+import lldb
+import commands
+import optparse
+import shlex
+
+def stack_frames(debugger, command, result, dict):
+ command_args = shlex.split(command)
+ usage = "usage: %prog [options] <PATH> [PATH ...]"
+ description='''This command will enumerate all stack frames, print the stack size for each, and print an aggregation of which functions have the largest stack frame sizes at the end.'''
+ parser = optparse.OptionParser(description=description, prog='ls',usage=usage)
+ parser.add_option('-v', '--verbose', action='store_true', dest='verbose', help='display verbose debug info', default=False)
+ try:
+ (options, args) = parser.parse_args(command_args)
+ except:
+ return
+
+ frame_info = {}
+ for thread in lldb.process:
+ last_frame = None
+ print "thread %u" % (thread.id)
+ for frame in thread.frames:
+ if last_frame:
+ frame_size = 0
+ if frame.idx == 1:
+ if frame.fp == last_frame.fp:
+ # No frame one the first frame (might be right at the entry point)
+ first_frame_size = 0
+ frame_size = frame.fp - frame.sp
+ else:
+ # First frame that has a valid size
+ first_frame_size = last_frame.fp - last_frame.sp
+ print "frame[%u] size 0x%x" % (last_frame.idx, first_frame_size)
+ if first_frame_size:
+ name = last_frame.name
+ if name not in frame_info:
+ frame_info[name] = first_frame_size
+ else:
+ frame_info[name] += first_frame_size
+ else:
+ # Second or higher frame
+ frame_size = frame.fp - last_frame.fp
+ print "frame[%u] size 0x%x" % (frame.idx, frame_size)
+ if frame_size > 0:
+ name = frame.name
+ if name not in frame_info:
+ frame_info[name] = frame_size
+ else:
+ frame_info[name] += frame_size
+ last_frame = frame
+ print frame_info
+
+
+lldb.debugger.HandleCommand("command script add -f stacks.stack_frames stack_frames")
+print "A new command called 'stack_frames' was added, type 'stack_frames --help' for more information."
\ No newline at end of file