| """ | |
| Test lldb-dap stack trace when module is missing | |
| """ | |
| from lldbsuite.test.decorators import skipUnlessPlatform | |
| from lldbsuite.test.lldbtest import line_number | |
| import lldbdap_testcase | |
| import re | |
| class TestDAP_stackTraceMissingModule(lldbdap_testcase.DAPTestCaseBase): | |
| @skipUnlessPlatform(["linux"]) | |
| def test_missingModule(self): | |
| """ | |
| Test that the stack frame without a module still has assembly source. | |
| """ | |
| program = self.getBuildArtifact("a.out") | |
| self.build_and_launch(program, commandEscapePrefix="") | |
| source = "main.c" | |
| self.set_source_breakpoints( | |
| source, | |
| [line_number(source, "// Break here")], | |
| ) | |
| self.continue_to_next_stop() | |
| # Evaluate expr -- func | |
| expr_result = self.dap_server.request_evaluate( | |
| expression="expr -f pointer -- func", | |
| context="repl", | |
| ) | |
| expr_result_address = re.search( | |
| r"0x[0-9a-fA-F]+", expr_result["body"]["result"] | |
| ) | |
| self.assertIsNotNone( | |
| expr_result_address, "Failed to get address of dynamic allocated func" | |
| ) | |
| func_address = expr_result_address.group(0) | |
| self.dap_server.request_evaluate( | |
| expression=f"breakpoint set --address {func_address}", | |
| context="repl", | |
| ) | |
| self.continue_to_next_stop() | |
| frame_without_module = self.get_stackFrames()[0] | |
| self.assertIn("line", frame_without_module, "Line number missing.") | |
| self.assertIn("column", frame_without_module, "Column number missing.") | |
| self.assertIn("source", frame_without_module, "Source location missing.") | |
| source = frame_without_module["source"] | |
| self.assertIn("sourceReference", source, "Source reference missing.") |