From 6b152ff550e68f09719985258e7fa4dc1bfe482e Mon Sep 17 00:00:00 2001 From: Greg Clayton Date: Mon, 10 Sep 2012 20:55:08 +0000 Subject: [PATCH] Added a python example that will compute which functions in a process are hogging the stack. llvm-svn: 163543 --- lldb/examples/python/stacks.py | 56 ++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100755 lldb/examples/python/stacks.py diff --git a/lldb/examples/python/stacks.py b/lldb/examples/python/stacks.py new file mode 100755 index 000000000000..7b547f4eb2dd --- /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 ...]" + 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