summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/lldb/examples/python/stacks.py
diff options
context:
space:
mode:
authorpatrick <patrick@openbsd.org>2020-08-03 14:33:06 +0000
committerpatrick <patrick@openbsd.org>2020-08-03 14:33:06 +0000
commit061da546b983eb767bad15e67af1174fb0bcf31c (patch)
tree83c78b820819d70aa40c36d90447978b300078c5 /gnu/llvm/lldb/examples/python/stacks.py
parentImport LLVM 10.0.0 release including clang, lld and lldb. (diff)
downloadwireguard-openbsd-061da546b983eb767bad15e67af1174fb0bcf31c.tar.xz
wireguard-openbsd-061da546b983eb767bad15e67af1174fb0bcf31c.zip
Import LLVM 10.0.0 release including clang, lld and lldb.
ok hackroom tested by plenty
Diffstat (limited to 'gnu/llvm/lldb/examples/python/stacks.py')
-rwxr-xr-xgnu/llvm/lldb/examples/python/stacks.py68
1 files changed, 68 insertions, 0 deletions
diff --git a/gnu/llvm/lldb/examples/python/stacks.py b/gnu/llvm/lldb/examples/python/stacks.py
new file mode 100755
index 00000000000..a676b82d097
--- /dev/null
+++ b/gnu/llvm/lldb/examples/python/stacks.py
@@ -0,0 +1,68 @@
+#!/usr/bin/python
+from __future__ import print_function
+import lldb
+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.")