1import lldb
2from lldbsuite.test.decorators import *
3from lldbsuite.test.lldbtest import *
4import lldbsuite.test.lldbutil as lldbutil
5
6
7class TestMembersAndLocalsWithSameName(TestBase):
8    def test_when_stopped_in_method(self):
9        self._load_exe()
10
11        # Set breakpoints
12        bp1 = self.target.BreakpointCreateBySourceRegex("Break 1", self.src_file_spec)
13        self.assertTrue(bp1.IsValid() and bp1.GetNumLocations() >= 1, VALID_BREAKPOINT)
14        bp2 = self.target.BreakpointCreateBySourceRegex("Break 2", self.src_file_spec)
15        self.assertTrue(bp2.IsValid() and bp2.GetNumLocations() >= 1, VALID_BREAKPOINT)
16        bp3 = self.target.BreakpointCreateBySourceRegex("Break 3", self.src_file_spec)
17        self.assertTrue(bp3.IsValid() and bp3.GetNumLocations() >= 1, VALID_BREAKPOINT)
18        bp4 = self.target.BreakpointCreateBySourceRegex("Break 4", self.src_file_spec)
19        self.assertTrue(bp4.IsValid() and bp4.GetNumLocations() >= 1, VALID_BREAKPOINT)
20
21        # Launch the process
22        self.process = self.target.LaunchSimple(
23            None, None, self.get_process_working_directory()
24        )
25        self.assertTrue(self.process.IsValid(), PROCESS_IS_VALID)
26
27        self.assertEqual(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
28
29        self._test_globals()
30
31        self.process.Continue()
32        self.assertEqual(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
33        thread = lldbutil.get_stopped_thread(self.process, lldb.eStopReasonBreakpoint)
34        self.assertTrue(thread.IsValid())
35        frame = thread.GetSelectedFrame()
36        self.assertTrue(frame.IsValid())
37
38        val = frame.EvaluateExpression("a")
39        self.assertTrue(val.IsValid())
40        self.assertEqual(val.GetValueAsUnsigned(), 12345)
41
42        val = frame.EvaluateExpression("b")
43        self.assertTrue(val.IsValid())
44        self.assertEqual(val.GetValueAsUnsigned(), 54321)
45
46        val = frame.EvaluateExpression("c")
47        self.assertTrue(val.IsValid())
48        self.assertEqual(val.GetValueAsUnsigned(), 34567)
49
50        self.process.Continue()
51        self.assertEqual(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
52        thread = lldbutil.get_stopped_thread(self.process, lldb.eStopReasonBreakpoint)
53        self.assertTrue(thread.IsValid())
54        frame = thread.GetSelectedFrame()
55        self.assertTrue(frame.IsValid())
56
57        val = frame.EvaluateExpression("a")
58        self.assertTrue(val.IsValid())
59        self.assertEqual(val.GetValueAsUnsigned(), 10001)
60
61        val = frame.EvaluateExpression("b")
62        self.assertTrue(val.IsValid())
63        self.assertEqual(val.GetValueAsUnsigned(), 10002)
64
65        val = frame.EvaluateExpression("c")
66        self.assertTrue(val.IsValid())
67        self.assertEqual(val.GetValueAsUnsigned(), 10003)
68
69        self.process.Continue()
70        self.assertEqual(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
71        thread = lldbutil.get_stopped_thread(self.process, lldb.eStopReasonBreakpoint)
72        self.assertTrue(thread.IsValid())
73        frame = thread.GetSelectedFrame()
74        self.assertTrue(frame.IsValid())
75
76        val = frame.EvaluateExpression("a")
77        self.assertTrue(val.IsValid())
78        self.assertEqual(val.GetValueAsUnsigned(), 1)
79
80        val = frame.EvaluateExpression("b")
81        self.assertTrue(val.IsValid())
82        self.assertEqual(val.GetValueAsUnsigned(), 2)
83
84        val = frame.EvaluateExpression("c")
85        self.assertTrue(val.IsValid())
86        self.assertEqual(val.GetValueAsUnsigned(), 778899)
87
88    def test_when_stopped_in_function(self):
89        self._load_exe()
90
91        # Set breakpoints
92        bp1 = self.target.BreakpointCreateBySourceRegex("Break 1", self.src_file_spec)
93        self.assertTrue(bp1.IsValid() and bp1.GetNumLocations() >= 1, VALID_BREAKPOINT)
94        bp5 = self.target.BreakpointCreateBySourceRegex("Break 5", self.src_file_spec)
95        self.assertTrue(bp5.IsValid() and bp5.GetNumLocations() >= 1, VALID_BREAKPOINT)
96        bp6 = self.target.BreakpointCreateBySourceRegex("Break 6", self.src_file_spec)
97        self.assertTrue(bp6.IsValid() and bp6.GetNumLocations() >= 1, VALID_BREAKPOINT)
98        bp7 = self.target.BreakpointCreateBySourceRegex("Break 7", self.src_file_spec)
99        self.assertTrue(bp7.IsValid() and bp7.GetNumLocations() >= 1, VALID_BREAKPOINT)
100
101        # Launch the process
102        self.process = self.target.LaunchSimple(
103            None, None, self.get_process_working_directory()
104        )
105        self.assertTrue(self.process.IsValid(), PROCESS_IS_VALID)
106
107        self.assertEqual(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
108
109        self._test_globals()
110
111        self.process.Continue()
112        self.assertEqual(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
113        thread = lldbutil.get_stopped_thread(self.process, lldb.eStopReasonBreakpoint)
114        self.assertTrue(thread.IsValid())
115        frame = thread.GetSelectedFrame()
116        self.assertTrue(frame.IsValid())
117
118        self.enable_expression_log()
119        val = frame.EvaluateExpression("a")
120        self.disable_expression_log_and_check_for_locals(["a"])
121        self.assertTrue(val.IsValid())
122        self.assertEqual(val.GetValueAsUnsigned(), 12345)
123
124        val = frame.EvaluateExpression("b")
125        self.assertTrue(val.IsValid())
126        self.assertEqual(val.GetValueAsUnsigned(), 54321)
127
128        val = frame.EvaluateExpression("c")
129        self.assertTrue(val.IsValid())
130        self.assertEqual(val.GetValueAsUnsigned(), 34567)
131
132        self.process.Continue()
133        self.assertEqual(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
134        thread = lldbutil.get_stopped_thread(self.process, lldb.eStopReasonBreakpoint)
135        self.assertTrue(thread.IsValid())
136        frame = thread.GetSelectedFrame()
137        self.assertTrue(frame.IsValid())
138
139        val = frame.EvaluateExpression("a")
140        self.assertTrue(val.IsValid())
141        self.assertEqual(val.GetValueAsUnsigned(), 10001)
142
143        val = frame.EvaluateExpression("b")
144        self.assertTrue(val.IsValid())
145        self.assertEqual(val.GetValueAsUnsigned(), 10002)
146
147        val = frame.EvaluateExpression("c")
148        self.assertTrue(val.IsValid())
149        self.assertEqual(val.GetValueAsUnsigned(), 10003)
150
151        self.enable_expression_log()
152        val = frame.EvaluateExpression("c-b")
153        self.disable_expression_log_and_check_for_locals(["c", "b"])
154        self.assertTrue(val.IsValid())
155        self.assertEqual(val.GetValueAsUnsigned(), 1)
156
157        self.process.Continue()
158        self.assertEqual(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
159        thread = lldbutil.get_stopped_thread(self.process, lldb.eStopReasonBreakpoint)
160        self.assertTrue(thread.IsValid())
161        frame = thread.GetSelectedFrame()
162        self.assertTrue(frame.IsValid())
163
164        val = frame.EvaluateExpression("a")
165        self.assertTrue(val.IsValid())
166        self.assertEqual(val.GetValueAsUnsigned(), 1)
167
168        val = frame.EvaluateExpression("b")
169        self.assertTrue(val.IsValid())
170        self.assertEqual(val.GetValueAsUnsigned(), 2)
171
172        val = frame.EvaluateExpression("c")
173        self.assertTrue(val.IsValid())
174        self.assertEqual(val.GetValueAsUnsigned(), 778899)
175
176        self.enable_expression_log()
177        val = frame.EvaluateExpression("a+b")
178        self.disable_expression_log_and_check_for_locals(["a", "b"])
179        self.assertTrue(val.IsValid())
180        self.assertEqual(val.GetValueAsUnsigned(), 3)
181
182    def _load_exe(self):
183        self.build()
184
185        cwd = os.getcwd()
186
187        src_file = os.path.join(cwd, "main.cpp")
188        self.src_file_spec = lldb.SBFileSpec(src_file)
189        self.assertTrue(self.src_file_spec.IsValid(), "breakpoint file")
190
191        # Get the path of the executable
192        exe_path = self.getBuildArtifact("a.out")
193
194        # Load the executable
195        self.target = self.dbg.CreateTarget(exe_path)
196        self.assertTrue(self.target.IsValid(), VALID_TARGET)
197
198    def _test_globals(self):
199        thread = lldbutil.get_stopped_thread(self.process, lldb.eStopReasonBreakpoint)
200        self.assertTrue(thread.IsValid())
201        frame = thread.GetSelectedFrame()
202        self.assertTrue(frame.IsValid())
203
204        self.enable_expression_log()
205        val = frame.EvaluateExpression("a")
206        self.disable_expression_log_and_check_for_locals([])
207        self.assertTrue(val.IsValid())
208        self.assertEqual(val.GetValueAsUnsigned(), 112233)
209
210        val = frame.EvaluateExpression("b")
211        self.assertTrue(val.IsValid())
212        self.assertEqual(val.GetValueAsUnsigned(), 445566)
213
214        val = frame.EvaluateExpression("c")
215        self.assertTrue(val.IsValid())
216        self.assertEqual(val.GetValueAsUnsigned(), 778899)
217
218    def enable_expression_log(self):
219        log_file = self.getBuildArtifact("expr.log")
220        self.runCmd("log enable  -f '%s' lldb expr" % (log_file))
221
222    def disable_expression_log_and_check_for_locals(self, variables):
223        log_file = self.getBuildArtifact("expr.log")
224        self.runCmd("log disable lldb expr")
225        local_var_regex = re.compile(r".*__lldb_local_vars::(.*);")
226        matched = []
227        with open(log_file, "r") as log:
228            for line in log:
229                if line.find("LLDB_BODY_START") != -1:
230                    break
231                m = re.match(local_var_regex, line)
232                if m:
233                    self.assertIn(m.group(1), variables)
234                    matched.append(m.group(1))
235        self.assertEqual([item for item in variables if item not in matched], [])
236