summaryrefslogtreecommitdiff
path: root/lldb/examples
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2016-06-23 19:54:32 +0000
committerGreg Clayton <gclayton@apple.com>2016-06-23 19:54:32 +0000
commitbbc2c88042445ca0beea4ba37947ca6910cfa9d2 (patch)
treeaf98f1daa1f1d29a26fab773b25d66146ce59515 /lldb/examples
parent1b3e9bc1331ccf67ac0cd0cef4f0565bdd4e1755 (diff)
Added a new python example which installs a command called "shadow".
This shows how to grab individual blocks from stack frames and get only the variables from those blocks. It then will iterate over all of the parent blocks and look for shadowed variables.
Diffstat (limited to 'lldb/examples')
-rw-r--r--lldb/examples/python/shadow.py59
1 files changed, 59 insertions, 0 deletions
diff --git a/lldb/examples/python/shadow.py b/lldb/examples/python/shadow.py
new file mode 100644
index 00000000000..6da2bcec9a7
--- /dev/null
+++ b/lldb/examples/python/shadow.py
@@ -0,0 +1,59 @@
+#!/usr/bin/python
+
+import lldb
+import shlex
+
+@lldb.command("shadow")
+def check_shadow_command(debugger, command, result, dict):
+ target = debugger.GetSelectedTarget()
+ if not target:
+ print >>result, "invalid target"
+ return
+ process = target.GetProcess()
+ if not process:
+ print >>result, "invalid process"
+ return
+ thread = process.GetSelectedThread()
+ if not thread:
+ print >>result, "invalid thread"
+ return
+ frame = thread.GetSelectedFrame()
+ if not frame:
+ print >>result, "invalid frame"
+ return
+ # Parse command line args
+ command_args = shlex.split(command)
+ # TODO: add support for using arguments that are passed to this command...
+
+ # Make a dictionary of variable name to "SBBlock and SBValue"
+ var_dict = {}
+
+ # Get the deepest most block from the current frame
+ block = frame.GetBlock()
+ # Iterate through the block and all of its parents
+ while block.IsValid():
+ # Get block variables from the current block only
+ block_vars = block.GetVariables(frame, True, True, True, 0)
+ # Iterate through all variables in the current block
+ for block_var in block_vars:
+ # Get the variable name and see if we already have a variable by this name?
+ block_var_name = block_var.GetName()
+ if block_var_name in var_dict:
+ # We already have seen a variable with this name, so it is shadowed
+ shadow_block_and_vars = var_dict[block_var_name]
+ for shadow_block_and_var in shadow_block_and_vars:
+ print shadow_block_and_var[0], shadow_block_and_var[1]
+ print 'is shadowed by:'
+ print block, block_var
+ # Since we can have multiple shadowed variables, we our variable
+ # name dictionary to have an array or "block + variable" pairs so
+ # We can correctly print out all shadowed variables and whow which
+ # blocks they come from
+ if block_var_name in var_dict:
+ var_dict[block_var_name].append([block, block_var])
+ else:
+ var_dict[block_var_name] = [[block, block_var]]
+ # Get the parent block and continue
+ block = block.GetParent()
+
+