forked from OSchip/llvm-project
60 lines
2.3 KiB
Python
60 lines
2.3 KiB
Python
#!/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()
|
|
|
|
|