[Lldb-commits] [lldb] r163543 - /lldb/trunk/examples/python/stacks.py
Greg Clayton
gclayton at apple.com
Mon Sep 10 13:55:08 PDT 2012
Author: gclayton
Date: Mon Sep 10 15:55:08 2012
New Revision: 163543
URL: http://llvm.org/viewvc/llvm-project?rev=163543&view=rev
Log:
Added a python example that will compute which functions in a process are hogging the stack.
Added:
lldb/trunk/examples/python/stacks.py (with props)
Added: lldb/trunk/examples/python/stacks.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/examples/python/stacks.py?rev=163543&view=auto
==============================================================================
--- lldb/trunk/examples/python/stacks.py (added)
+++ lldb/trunk/examples/python/stacks.py Mon Sep 10 15:55:08 2012
@@ -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
Propchange: lldb/trunk/examples/python/stacks.py
------------------------------------------------------------------------------
svn:executable = *
More information about the lldb-commits
mailing list