aboutsummaryrefslogtreecommitdiff
path: root/examples/python/stacks.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/python/stacks.py')
-rwxr-xr-xexamples/python/stacks.py59
1 files changed, 59 insertions, 0 deletions
diff --git a/examples/python/stacks.py b/examples/python/stacks.py
new file mode 100755
index 000000000000..06907e159d7f
--- /dev/null
+++ b/examples/python/stacks.py
@@ -0,0 +1,59 @@
+#!/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
+
+ target = debugger.GetSelectedTarget()
+ process = target.GetProcess()
+
+ frame_info = {}
+ for thread in 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 "<%#7x> %s" % (first_frame_size, last_frame)
+ 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 "<%#7x> %s" % (frame_size, frame)
+ 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