Greg Clayton | 6b152ff | 2012-09-10 20:55:08 +0000 | [diff] [blame^] | 1 | #!/usr/bin/python |
| 2 | |
| 3 | import lldb |
| 4 | import commands |
| 5 | import optparse |
| 6 | import shlex |
| 7 | |
| 8 | def stack_frames(debugger, command, result, dict): |
| 9 | command_args = shlex.split(command) |
| 10 | usage = "usage: %prog [options] <PATH> [PATH ...]" |
| 11 | 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.''' |
| 12 | parser = optparse.OptionParser(description=description, prog='ls',usage=usage) |
| 13 | parser.add_option('-v', '--verbose', action='store_true', dest='verbose', help='display verbose debug info', default=False) |
| 14 | try: |
| 15 | (options, args) = parser.parse_args(command_args) |
| 16 | except: |
| 17 | return |
| 18 | |
| 19 | frame_info = {} |
| 20 | for thread in lldb.process: |
| 21 | last_frame = None |
| 22 | print "thread %u" % (thread.id) |
| 23 | for frame in thread.frames: |
| 24 | if last_frame: |
| 25 | frame_size = 0 |
| 26 | if frame.idx == 1: |
| 27 | if frame.fp == last_frame.fp: |
| 28 | # No frame one the first frame (might be right at the entry point) |
| 29 | first_frame_size = 0 |
| 30 | frame_size = frame.fp - frame.sp |
| 31 | else: |
| 32 | # First frame that has a valid size |
| 33 | first_frame_size = last_frame.fp - last_frame.sp |
| 34 | print "frame[%u] size 0x%x" % (last_frame.idx, first_frame_size) |
| 35 | if first_frame_size: |
| 36 | name = last_frame.name |
| 37 | if name not in frame_info: |
| 38 | frame_info[name] = first_frame_size |
| 39 | else: |
| 40 | frame_info[name] += first_frame_size |
| 41 | else: |
| 42 | # Second or higher frame |
| 43 | frame_size = frame.fp - last_frame.fp |
| 44 | print "frame[%u] size 0x%x" % (frame.idx, frame_size) |
| 45 | if frame_size > 0: |
| 46 | name = frame.name |
| 47 | if name not in frame_info: |
| 48 | frame_info[name] = frame_size |
| 49 | else: |
| 50 | frame_info[name] += frame_size |
| 51 | last_frame = frame |
| 52 | print frame_info |
| 53 | |
| 54 | |
| 55 | lldb.debugger.HandleCommand("command script add -f stacks.stack_frames stack_frames") |
| 56 | print "A new command called 'stack_frames' was added, type 'stack_frames --help' for more information." |