
* Fix error in lldb-dap when the stack trace contains a frame without a module by simply showing the first 32 assembly instructions after the PC. * Adds a test with a simple example that triggers this case.
55 lines
1.8 KiB
Python
55 lines
1.8 KiB
Python
"""
|
|
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.")
|