diff options
author | Greg Clayton <gclayton@apple.com> | 2012-09-10 20:55:08 +0000 |
---|---|---|
committer | Greg Clayton <gclayton@apple.com> | 2012-09-10 20:55:08 +0000 |
commit | 6b152ff550e68f09719985258e7fa4dc1bfe482e (patch) | |
tree | e4804ad614f440c43f3d8aea92bf44165d6013d3 | |
parent | 6f8d8b2406e854443df7c5129a4132273b64f4fb (diff) | |
download | bcm5719-llvm-6b152ff550e68f09719985258e7fa4dc1bfe482e.tar.gz bcm5719-llvm-6b152ff550e68f09719985258e7fa4dc1bfe482e.zip |
Added a python example that will compute which functions in a process are hogging the stack.
llvm-svn: 163543
-rwxr-xr-x | lldb/examples/python/stacks.py | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/lldb/examples/python/stacks.py b/lldb/examples/python/stacks.py new file mode 100755 index 00000000000..7b547f4eb2d --- /dev/null +++ b/lldb/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 |