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