| """ | |
| Test lldb-dap variables/stackTrace request for optimized code | |
| """ | |
| import dap_server | |
| import lldbdap_testcase | |
| from lldbsuite.test import lldbutil | |
| from lldbsuite.test.decorators import * | |
| from lldbsuite.test.lldbtest import * | |
| class TestDAP_optimized(lldbdap_testcase.DAPTestCaseBase): | |
| @skipIfWindows | |
| def test_stack_frame_name(self): | |
| """Test optimized frame has special name suffix.""" | |
| program = self.getBuildArtifact("a.out") | |
| self.build_and_launch(program) | |
| source = "main.cpp" | |
| breakpoint_line = line_number(source, "// breakpoint 1") | |
| lines = [breakpoint_line] | |
| breakpoint_ids = self.set_source_breakpoints(source, lines) | |
| self.assertEqual( | |
| len(breakpoint_ids), len(lines), "expect correct number of breakpoints" | |
| ) | |
| self.continue_to_breakpoints(breakpoint_ids) | |
| leaf_frame = self.dap_server.get_stackFrame(frameIndex=0) | |
| self.assertTrue(leaf_frame["name"].endswith(" [opt]")) | |
| parent_frame = self.dap_server.get_stackFrame(frameIndex=1) | |
| self.assertTrue(parent_frame["name"].endswith(" [opt]")) | |
| @skipIfAsan # On ASAN builds this test intermittently fails https://github.com/llvm/llvm-project/issues/111061 | |
| @skipIfWindows | |
| def test_optimized_variable(self): | |
| """Test optimized variable value contains error.""" | |
| program = self.getBuildArtifact("a.out") | |
| self.build_and_launch(program) | |
| source = "main.cpp" | |
| breakpoint_line = line_number(source, "// breakpoint 2") | |
| lines = [breakpoint_line] | |
| # Set breakpoint in the thread function so we can step the threads | |
| breakpoint_ids = self.set_source_breakpoints(source, lines) | |
| self.assertEqual( | |
| len(breakpoint_ids), len(lines), "expect correct number of breakpoints" | |
| ) | |
| self.continue_to_breakpoints(breakpoint_ids) | |
| optimized_variable = self.dap_server.get_local_variable("argc") | |
| value: str = optimized_variable["value"] | |
| self.assertTrue( | |
| value.startswith("<error:"), | |
| f"expect error for value: '{value}'", | |
| ) | |
| self.assertTrue( | |
| ("could not evaluate DW_OP_entry_value: no parent function" in value) | |
| or ("variable not available" in value) | |
| ) | |
| self.continue_to_exit() |