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