annotate lldb/examples/python/shadow.py @ 212:50b3abffaea6

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 11 Jun 2021 10:19:35 +0900
parents 2e18cbf3894f
children c4bab56944e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1 #!/usr/bin/env python
150
anatofuz
parents:
diff changeset
2 from __future__ import print_function
anatofuz
parents:
diff changeset
3
anatofuz
parents:
diff changeset
4 import lldb
anatofuz
parents:
diff changeset
5 import shlex
anatofuz
parents:
diff changeset
6
anatofuz
parents:
diff changeset
7
anatofuz
parents:
diff changeset
8 @lldb.command("shadow")
anatofuz
parents:
diff changeset
9 def check_shadow_command(debugger, command, exe_ctx, result, dict):
anatofuz
parents:
diff changeset
10 '''Check the currently selected stack frame for shadowed variables'''
anatofuz
parents:
diff changeset
11 process = exe_ctx.GetProcess()
anatofuz
parents:
diff changeset
12 state = process.GetState()
anatofuz
parents:
diff changeset
13 if state != lldb.eStateStopped:
anatofuz
parents:
diff changeset
14 print("process must be stopped, state is %s" % lldb.SBDebugger.StateAsCString(
anatofuz
parents:
diff changeset
15 state), file=result)
anatofuz
parents:
diff changeset
16 return
anatofuz
parents:
diff changeset
17 frame = exe_ctx.GetFrame()
anatofuz
parents:
diff changeset
18 if not frame:
anatofuz
parents:
diff changeset
19 print("invalid frame", file=result)
anatofuz
parents:
diff changeset
20 return
anatofuz
parents:
diff changeset
21 # Parse command line args
anatofuz
parents:
diff changeset
22 command_args = shlex.split(command)
anatofuz
parents:
diff changeset
23 # TODO: add support for using arguments that are passed to this command...
anatofuz
parents:
diff changeset
24
anatofuz
parents:
diff changeset
25 # Make a dictionary of variable name to "SBBlock and SBValue"
anatofuz
parents:
diff changeset
26 shadow_dict = {}
anatofuz
parents:
diff changeset
27
anatofuz
parents:
diff changeset
28 num_shadowed_variables = 0
anatofuz
parents:
diff changeset
29 # Get the deepest most block from the current frame
anatofuz
parents:
diff changeset
30 block = frame.GetBlock()
anatofuz
parents:
diff changeset
31 # Iterate through the block and all of its parents
anatofuz
parents:
diff changeset
32 while block.IsValid():
anatofuz
parents:
diff changeset
33 # Get block variables from the current block only
anatofuz
parents:
diff changeset
34 block_vars = block.GetVariables(frame, True, True, True, 0)
anatofuz
parents:
diff changeset
35 # Iterate through all variables in the current block
anatofuz
parents:
diff changeset
36 for block_var in block_vars:
anatofuz
parents:
diff changeset
37 # Since we can have multiple shadowed variables, we our variable
anatofuz
parents:
diff changeset
38 # name dictionary to have an array or "block + variable" pairs so
anatofuz
parents:
diff changeset
39 # We can correctly print out all shadowed variables and whow which
anatofuz
parents:
diff changeset
40 # blocks they come from
anatofuz
parents:
diff changeset
41 block_var_name = block_var.GetName()
anatofuz
parents:
diff changeset
42 if block_var_name in shadow_dict:
anatofuz
parents:
diff changeset
43 shadow_dict[block_var_name].append(block_var)
anatofuz
parents:
diff changeset
44 else:
anatofuz
parents:
diff changeset
45 shadow_dict[block_var_name] = [block_var]
anatofuz
parents:
diff changeset
46 # Get the parent block and continue
anatofuz
parents:
diff changeset
47 block = block.GetParent()
anatofuz
parents:
diff changeset
48
anatofuz
parents:
diff changeset
49 num_shadowed_variables = 0
anatofuz
parents:
diff changeset
50 if shadow_dict:
anatofuz
parents:
diff changeset
51 for name in shadow_dict.keys():
anatofuz
parents:
diff changeset
52 shadow_vars = shadow_dict[name]
anatofuz
parents:
diff changeset
53 if len(shadow_vars) > 1:
anatofuz
parents:
diff changeset
54 print('"%s" is shadowed by the following declarations:' % (name))
anatofuz
parents:
diff changeset
55 num_shadowed_variables += 1
anatofuz
parents:
diff changeset
56 for shadow_var in shadow_vars:
anatofuz
parents:
diff changeset
57 print(str(shadow_var.GetDeclaration()), file=result)
anatofuz
parents:
diff changeset
58 if num_shadowed_variables == 0:
anatofuz
parents:
diff changeset
59 print('no variables are shadowed', file=result)