[Lldb-commits] [lldb] [lldb-dap] Take two at refactoring the startup sequence. (PR #140331)
via lldb-commits
lldb-commits at lists.llvm.org
Fri May 16 19:05:14 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lldb
Author: John Harrison (ashgti)
<details>
<summary>Changes</summary>
This is more straight forward refactor of the startup sequence that reverts parts of ba29e60f9a2222bd5e883579bb78db13fc5a7588. Unlike my previous attempt, I ended up removing the pending request queue and not including an `AsyncReqeustHandler` because I don't think we actually need that at the moment.
The key is that during the startup flow there are 2 parallel operations happening in the DAP that have different triggers.
* The `initialize` request is sent and once the response is received the `launch` or `attach` is sent.
* When the `initialized` event is recieved the `setBreakpionts` and other config requests are made followed by the `configurationDone` event.
I moved the `initialized` event back to happen in the `PostRun` of the `launch` or `attach` request handlers. This ensures that we have a valid target by the time the configuration calls are made. I added also added a few extra validations that to the `configurationeDone` handler to ensure we're in an expected state.
I've also fixed up the tests to match the new flow. With the other additional test fixes in 087a5d2ec7897cd99d3787820711fec76a8e1792 I think we've narrowed down the main source of test instability that motivated the startup sequence change.
---
Patch is 42.82 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/140331.diff
30 Files Affected:
- (modified) lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py (+10-14)
- (modified) lldb/packages/Python/lldbsuite/test/tools/lldb-dap/lldbdap_testcase.py (+3-67)
- (modified) lldb/test/API/tools/lldb-dap/breakpoint-events/TestDAP_breakpointEvents.py (+1-1)
- (modified) lldb/test/API/tools/lldb-dap/cancel/TestDAP_cancel.py (+2-2)
- (modified) lldb/test/API/tools/lldb-dap/completions/TestDAP_completions.py (+6-11)
- (modified) lldb/test/API/tools/lldb-dap/console/TestDAP_console.py (+7-6)
- (modified) lldb/test/API/tools/lldb-dap/console/TestDAP_redirection_to_console.py (+1-3)
- (modified) lldb/test/API/tools/lldb-dap/coreFile/TestDAP_coreFile.py (+1)
- (modified) lldb/test/API/tools/lldb-dap/evaluate/TestDAP_evaluate.py (-1)
- (modified) lldb/test/API/tools/lldb-dap/launch/TestDAP_launch.py (+2-2)
- (modified) lldb/test/API/tools/lldb-dap/module-event/TestDAP_module_event.py (+1-1)
- (modified) lldb/test/API/tools/lldb-dap/module/TestDAP_module.py (+2-2)
- (modified) lldb/test/API/tools/lldb-dap/repl-mode/TestDAP_repl_mode_detection.py (+1-1)
- (modified) lldb/test/API/tools/lldb-dap/restart/TestDAP_restart.py (+4-1)
- (modified) lldb/test/API/tools/lldb-dap/send-event/TestDAP_sendEvent.py (+2-1)
- (modified) lldb/test/API/tools/lldb-dap/stackTrace/TestDAP_stackTrace.py (+1-1)
- (modified) lldb/test/API/tools/lldb-dap/stackTraceDisassemblyDisplay/TestDAP_stackTraceDisassemblyDisplay.py (+1-1)
- (modified) lldb/test/API/tools/lldb-dap/startDebugging/TestDAP_startDebugging.py (+1-1)
- (modified) lldb/test/API/tools/lldb-dap/stop-hooks/TestDAP_stop_hooks.py (+1-1)
- (modified) lldb/test/API/tools/lldb-dap/threads/TestDAP_threads.py (+4-1)
- (modified) lldb/test/API/tools/lldb-dap/variables/children/TestDAP_variables_children.py (+1-4)
- (modified) lldb/tools/lldb-dap/DAP.cpp (+4-25)
- (modified) lldb/tools/lldb-dap/DAP.h (-1)
- (modified) lldb/tools/lldb-dap/Handler/AttachRequestHandler.cpp (+1-18)
- (modified) lldb/tools/lldb-dap/Handler/ConfigurationDoneRequestHandler.cpp (+43-39)
- (modified) lldb/tools/lldb-dap/Handler/InitializeRequestHandler.cpp (-4)
- (modified) lldb/tools/lldb-dap/Handler/LaunchRequestHandler.cpp (+1-19)
- (modified) lldb/tools/lldb-dap/Handler/RequestHandler.h (+39-23)
- (modified) lldb/tools/lldb-dap/Protocol/ProtocolBase.h (+3)
- (modified) lldb/tools/lldb-dap/Protocol/ProtocolRequests.h (+7)
``````````diff
diff --git a/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py b/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py
index d3589e78b6bc7..70fd0b0c419db 100644
--- a/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py
+++ b/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py
@@ -133,6 +133,7 @@ def __init__(
self.output_condition = threading.Condition()
self.output: dict[str, list[str]] = {}
self.configuration_done_sent = False
+ self.initialized = False
self.frame_scopes = {}
self.init_commands = init_commands
self.disassembled_instructions = {}
@@ -235,6 +236,8 @@ def _handle_recv_packet(self, packet: Optional[ProtocolMessage]) -> bool:
self.output_condition.release()
# no need to add 'output' event packets to our packets list
return keepGoing
+ elif event == "initialized":
+ self.initialized = True
elif event == "process":
# When a new process is attached or launched, remember the
# details that are available in the body of the event
@@ -602,7 +605,7 @@ def request_attach(
exitCommands: Optional[list[str]] = None,
terminateCommands: Optional[list[str]] = None,
coreFile: Optional[str] = None,
- stopOnAttach=True,
+ stopOnEntry=False,
sourceMap: Optional[Union[list[tuple[str, str]], dict[str, str]]] = None,
gdbRemotePort: Optional[int] = None,
gdbRemoteHostname: Optional[str] = None,
@@ -629,8 +632,8 @@ def request_attach(
args_dict["attachCommands"] = attachCommands
if coreFile:
args_dict["coreFile"] = coreFile
- if stopOnAttach:
- args_dict["stopOnEntry"] = stopOnAttach
+ if stopOnEntry:
+ args_dict["stopOnEntry"] = stopOnEntry
if postRunCommands:
args_dict["postRunCommands"] = postRunCommands
if sourceMap:
@@ -640,11 +643,7 @@ def request_attach(
if gdbRemoteHostname is not None:
args_dict["gdb-remote-hostname"] = gdbRemoteHostname
command_dict = {"command": "attach", "type": "request", "arguments": args_dict}
- response = self.send_recv(command_dict)
-
- if response["success"]:
- self.wait_for_event("process")
- return response
+ return self.send_recv(command_dict)
def request_breakpointLocations(
self, file_path, line, end_line=None, column=None, end_column=None
@@ -677,6 +676,7 @@ def request_configurationDone(self):
response = self.send_recv(command_dict)
if response:
self.configuration_done_sent = True
+ self.request_threads()
return response
def _process_stopped(self):
@@ -824,7 +824,7 @@ def request_launch(
args: Optional[list[str]] = None,
cwd: Optional[str] = None,
env: Optional[dict[str, str]] = None,
- stopOnEntry=True,
+ stopOnEntry=False,
disableASLR=True,
disableSTDIO=False,
shellExpandArguments=False,
@@ -894,11 +894,7 @@ def request_launch(
if commandEscapePrefix is not None:
args_dict["commandEscapePrefix"] = commandEscapePrefix
command_dict = {"command": "launch", "type": "request", "arguments": args_dict}
- response = self.send_recv(command_dict)
-
- if response["success"]:
- self.wait_for_event("process")
- return response
+ return self.send_recv(command_dict)
def request_next(self, threadId, granularity="statement"):
if self.exit_status is not None:
diff --git a/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/lldbdap_testcase.py b/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/lldbdap_testcase.py
index d7cf8e2864324..afdc746ed0d0d 100644
--- a/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/lldbdap_testcase.py
+++ b/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/lldbdap_testcase.py
@@ -56,7 +56,7 @@ def set_source_breakpoints(self, source_path, lines, data=None):
It contains optional location/hitCondition/logMessage parameters.
"""
response = self.dap_server.request_setBreakpoints(source_path, lines, data)
- if response is None:
+ if response is None or not response["success"]:
return []
breakpoints = response["body"]["breakpoints"]
breakpoint_ids = []
@@ -354,13 +354,9 @@ def disassemble(self, threadId=None, frameIndex=None):
def attach(
self,
*,
- stopOnAttach=True,
disconnectAutomatically=True,
sourceInitFile=False,
expectFailure=False,
- sourceBreakpoints=None,
- functionBreakpoints=None,
- timeout=DEFAULT_TIMEOUT,
**kwargs,
):
"""Build the default Makefile target, create the DAP debug adapter,
@@ -378,37 +374,13 @@ def cleanup():
self.addTearDownHook(cleanup)
# Initialize and launch the program
self.dap_server.request_initialize(sourceInitFile)
- self.dap_server.wait_for_event("initialized", timeout)
-
- # Set source breakpoints as part of the launch sequence.
- if sourceBreakpoints:
- for source_path, lines in sourceBreakpoints:
- response = self.dap_server.request_setBreakpoints(source_path, lines)
- self.assertTrue(
- response["success"],
- "setBreakpoints failed (%s)" % (response),
- )
-
- # Set function breakpoints as part of the launch sequence.
- if functionBreakpoints:
- response = self.dap_server.request_setFunctionBreakpoints(
- functionBreakpoints
- )
- self.assertTrue(
- response["success"],
- "setFunctionBreakpoint failed (%s)" % (response),
- )
-
- self.dap_server.request_configurationDone()
- response = self.dap_server.request_attach(stopOnAttach=stopOnAttach, **kwargs)
+ response = self.dap_server.request_attach(**kwargs)
if expectFailure:
return response
if not (response and response["success"]):
self.assertTrue(
response["success"], "attach failed (%s)" % (response["message"])
)
- if stopOnAttach:
- self.dap_server.wait_for_stopped(timeout)
def launch(
self,
@@ -416,11 +388,7 @@ def launch(
*,
sourceInitFile=False,
disconnectAutomatically=True,
- sourceBreakpoints=None,
- functionBreakpoints=None,
expectFailure=False,
- stopOnEntry=True,
- timeout=DEFAULT_TIMEOUT,
**kwargs,
):
"""Sending launch request to dap"""
@@ -437,35 +405,7 @@ def cleanup():
# Initialize and launch the program
self.dap_server.request_initialize(sourceInitFile)
- self.dap_server.wait_for_event("initialized", timeout)
-
- # Set source breakpoints as part of the launch sequence.
- if sourceBreakpoints:
- for source_path, lines in sourceBreakpoints:
- response = self.dap_server.request_setBreakpoints(source_path, lines)
- self.assertTrue(
- response["success"],
- "setBreakpoints failed (%s)" % (response),
- )
-
- # Set function breakpoints as part of the launch sequence.
- if functionBreakpoints:
- response = self.dap_server.request_setFunctionBreakpoints(
- functionBreakpoints
- )
- self.assertTrue(
- response["success"],
- "setFunctionBreakpoint failed (%s)" % (response),
- )
-
- self.dap_server.request_configurationDone()
-
- response = self.dap_server.request_launch(
- program,
- stopOnEntry=stopOnEntry,
- **kwargs,
- )
-
+ response = self.dap_server.request_launch(program, **kwargs)
if expectFailure:
return response
if not (response and response["success"]):
@@ -473,10 +413,6 @@ def cleanup():
response["success"],
"launch failed (%s)" % (response["body"]["error"]["format"]),
)
- if stopOnEntry:
- self.dap_server.wait_for_stopped(timeout)
-
- return response
def build_and_launch(
self,
diff --git a/lldb/test/API/tools/lldb-dap/breakpoint-events/TestDAP_breakpointEvents.py b/lldb/test/API/tools/lldb-dap/breakpoint-events/TestDAP_breakpointEvents.py
index 25f031db5cac5..d46fc31d797da 100644
--- a/lldb/test/API/tools/lldb-dap/breakpoint-events/TestDAP_breakpointEvents.py
+++ b/lldb/test/API/tools/lldb-dap/breakpoint-events/TestDAP_breakpointEvents.py
@@ -52,7 +52,7 @@ def test_breakpoint_events(self):
# breakpoint events for these breakpoints but not for ones that are not
# set via the command interpreter.
bp_command = "breakpoint set --file foo.cpp --line %u" % (foo_bp2_line)
- self.build_and_launch(program, stopOnEntry=True, preRunCommands=[bp_command])
+ self.build_and_launch(program, preRunCommands=[bp_command])
main_bp_id = 0
foo_bp_id = 0
# Set breakpoints and verify that they got set correctly
diff --git a/lldb/test/API/tools/lldb-dap/cancel/TestDAP_cancel.py b/lldb/test/API/tools/lldb-dap/cancel/TestDAP_cancel.py
index 948c146d4da68..824ed8fe3bb97 100644
--- a/lldb/test/API/tools/lldb-dap/cancel/TestDAP_cancel.py
+++ b/lldb/test/API/tools/lldb-dap/cancel/TestDAP_cancel.py
@@ -44,7 +44,7 @@ def test_pending_request(self):
Tests cancelling a pending request.
"""
program = self.getBuildArtifact("a.out")
- self.build_and_launch(program, stopOnEntry=True)
+ self.build_and_launch(program)
# Use a relatively short timeout since this is only to ensure the
# following request is queued.
@@ -76,7 +76,7 @@ def test_inflight_request(self):
Tests cancelling an inflight request.
"""
program = self.getBuildArtifact("a.out")
- self.build_and_launch(program, stopOnEntry=True)
+ self.build_and_launch(program)
blocking_seq = self.async_blocking_request(duration=self.DEFAULT_TIMEOUT / 2)
# Wait for the sleep to start to cancel the inflight request.
diff --git a/lldb/test/API/tools/lldb-dap/completions/TestDAP_completions.py b/lldb/test/API/tools/lldb-dap/completions/TestDAP_completions.py
index 75876c248f86c..04897acfcf85d 100644
--- a/lldb/test/API/tools/lldb-dap/completions/TestDAP_completions.py
+++ b/lldb/test/API/tools/lldb-dap/completions/TestDAP_completions.py
@@ -46,17 +46,12 @@ def verify_completions(self, actual_list, expected_list, not_expected_list=[]):
def setup_debuggee(self):
program = self.getBuildArtifact("a.out")
source = "main.cpp"
- self.build_and_launch(
- program,
- stopOnEntry=True,
- sourceBreakpoints=[
- (
- source,
- [
- line_number(source, "// breakpoint 1"),
- line_number(source, "// breakpoint 2"),
- ],
- ),
+ self.build_and_launch(program)
+ self.set_source_breakpoints(
+ source,
+ [
+ line_number(source, "// breakpoint 1"),
+ line_number(source, "// breakpoint 2"),
],
)
diff --git a/lldb/test/API/tools/lldb-dap/console/TestDAP_console.py b/lldb/test/API/tools/lldb-dap/console/TestDAP_console.py
index 1f810afdbb667..7b4d1adbb2071 100644
--- a/lldb/test/API/tools/lldb-dap/console/TestDAP_console.py
+++ b/lldb/test/API/tools/lldb-dap/console/TestDAP_console.py
@@ -53,7 +53,7 @@ def test_scopes_variables_setVariable_evaluate(self):
character.
"""
program = self.getBuildArtifact("a.out")
- self.build_and_launch(program, stopOnEntry=True)
+ self.build_and_launch(program)
source = "main.cpp"
breakpoint1_line = line_number(source, "// breakpoint 1")
lines = [breakpoint1_line]
@@ -66,6 +66,7 @@ def test_scopes_variables_setVariable_evaluate(self):
# Cause a "scopes" to be sent for frame zero which should update the
# selected thread and frame to frame 0.
self.dap_server.get_local_variables(frameIndex=0)
+
# Verify frame #0 is selected in the command interpreter by running
# the "frame select" command with no frame index which will print the
# currently selected frame.
@@ -74,15 +75,15 @@ def test_scopes_variables_setVariable_evaluate(self):
# Cause a "scopes" to be sent for frame one which should update the
# selected thread and frame to frame 1.
self.dap_server.get_local_variables(frameIndex=1)
+
# Verify frame #1 is selected in the command interpreter by running
# the "frame select" command with no frame index which will print the
# currently selected frame.
-
self.check_lldb_command("frame select", "frame #1", "frame 1 is selected")
def test_custom_escape_prefix(self):
program = self.getBuildArtifact("a.out")
- self.build_and_launch(program, stopOnEntry=True, commandEscapePrefix="::")
+ self.build_and_launch(program, commandEscapePrefix="::")
source = "main.cpp"
breakpoint1_line = line_number(source, "// breakpoint 1")
breakpoint_ids = self.set_source_breakpoints(source, [breakpoint1_line])
@@ -97,7 +98,7 @@ def test_custom_escape_prefix(self):
def test_empty_escape_prefix(self):
program = self.getBuildArtifact("a.out")
- self.build_and_launch(program, stopOnEntry=True, commandEscapePrefix="")
+ self.build_and_launch(program, commandEscapePrefix="")
source = "main.cpp"
breakpoint1_line = line_number(source, "// breakpoint 1")
breakpoint_ids = self.set_source_breakpoints(source, [breakpoint1_line])
@@ -114,7 +115,7 @@ def test_empty_escape_prefix(self):
def test_exit_status_message_sigterm(self):
source = "main.cpp"
program = self.getBuildArtifact("a.out")
- self.build_and_launch(program, stopOnEntry=True, commandEscapePrefix="")
+ self.build_and_launch(program, commandEscapePrefix="")
breakpoint1_line = line_number(source, "// breakpoint 1")
breakpoint_ids = self.set_source_breakpoints(source, [breakpoint1_line])
self.continue_to_breakpoints(breakpoint_ids)
@@ -168,7 +169,7 @@ def test_exit_status_message_ok(self):
def test_diagnositcs(self):
program = self.getBuildArtifact("a.out")
- self.build_and_launch(program, stopOnEntry=True)
+ self.build_and_launch(program)
core = self.getBuildArtifact("minidump.core")
self.yaml2obj("minidump.yaml", core)
diff --git a/lldb/test/API/tools/lldb-dap/console/TestDAP_redirection_to_console.py b/lldb/test/API/tools/lldb-dap/console/TestDAP_redirection_to_console.py
index 23500bd6fe586..e367c327d4295 100644
--- a/lldb/test/API/tools/lldb-dap/console/TestDAP_redirection_to_console.py
+++ b/lldb/test/API/tools/lldb-dap/console/TestDAP_redirection_to_console.py
@@ -16,9 +16,7 @@ def test(self):
"""
program = self.getBuildArtifact("a.out")
self.build_and_launch(
- program,
- stopOnEntry=True,
- lldbDAPEnv={"LLDB_DAP_TEST_STDOUT_STDERR_REDIRECTION": ""},
+ program, lldbDAPEnv={"LLDB_DAP_TEST_STDOUT_STDERR_REDIRECTION": ""}
)
source = "main.cpp"
diff --git a/lldb/test/API/tools/lldb-dap/coreFile/TestDAP_coreFile.py b/lldb/test/API/tools/lldb-dap/coreFile/TestDAP_coreFile.py
index e678c5ee77fdc..db43dbaf515cf 100644
--- a/lldb/test/API/tools/lldb-dap/coreFile/TestDAP_coreFile.py
+++ b/lldb/test/API/tools/lldb-dap/coreFile/TestDAP_coreFile.py
@@ -19,6 +19,7 @@ def test_core_file(self):
self.create_debug_adapter()
self.attach(program=exe_file, coreFile=core_file)
+ self.dap_server.request_configurationDone()
expected_frames = [
{
diff --git a/lldb/test/API/tools/lldb-dap/evaluate/TestDAP_evaluate.py b/lldb/test/API/tools/lldb-dap/evaluate/TestDAP_evaluate.py
index 372a9bb75e007..2166e88151986 100644
--- a/lldb/test/API/tools/lldb-dap/evaluate/TestDAP_evaluate.py
+++ b/lldb/test/API/tools/lldb-dap/evaluate/TestDAP_evaluate.py
@@ -43,7 +43,6 @@ def run_test_evaluate_expressions(
self.build_and_launch(
program,
enableAutoVariableSummaries=enableAutoVariableSummaries,
- stopOnEntry=True,
)
source = "main.cpp"
self.set_source_breakpoints(
diff --git a/lldb/test/API/tools/lldb-dap/launch/TestDAP_launch.py b/lldb/test/API/tools/lldb-dap/launch/TestDAP_launch.py
index 0063954791fd5..8805ce50e6a21 100644
--- a/lldb/test/API/tools/lldb-dap/launch/TestDAP_launch.py
+++ b/lldb/test/API/tools/lldb-dap/launch/TestDAP_launch.py
@@ -87,7 +87,8 @@ def test_stopOnEntry(self):
"""
program = self.getBuildArtifact("a.out")
self.build_and_launch(program, stopOnEntry=True)
-
+ self.dap_server.request_configurationDone()
+ self.dap_server.wait_for_stopped()
self.assertTrue(
len(self.dap_server.thread_stop_reasons) > 0,
"expected stopped event during launch",
@@ -357,7 +358,6 @@ def test_commands(self):
terminateCommands = ["expr 4+2"]
self.build_and_launch(
program,
- stopOnEntry=True,
initCommands=initCommands,
preRunCommands=preRunCommands,
postRunCommands=postRunCommands,
diff --git a/lldb/test/API/tools/lldb-dap/module-event/TestDAP_module_event.py b/lldb/test/API/tools/lldb-dap/module-event/TestDAP_module_event.py
index 19de35b60a3ef..1ef2f2a8235a4 100644
--- a/lldb/test/API/tools/lldb-dap/module-event/TestDAP_module_event.py
+++ b/lldb/test/API/tools/lldb-dap/module-event/TestDAP_module_event.py
@@ -10,7 +10,7 @@ class TestDAP_module_event(lldbdap_testcase.DAPTestCaseBase):
@skipIfWindows
def test_module_event(self):
program = self.getBuildArtifact("a.out")
- self.build_and_launch(program, stopOnEntry=True)
+ self.build_and_launch(program)
source = "main.cpp"
breakpoint1_line = line_number(source, "// breakpoint 1")
diff --git a/lldb/test/API/tools/lldb-dap/module/TestDAP_module.py b/lldb/test/API/tools/lldb-dap/module/TestDAP_module.py
index b333efd7bfb1f..3fc0f752ee39e 100644
--- a/lldb/test/API/tools/lldb-dap/module/TestDAP_module.py
+++ b/lldb/test/API/tools/lldb-dap/module/TestDAP_module.py
@@ -14,7 +14,7 @@ class TestDAP_module(lldbdap_testcase.DAPTestCaseBase):
def run_test(self, symbol_basename, expect_debug_info_size):
program_basename = "a.out.stripped"
program = self.getBuildArtifact(program_basename)
- self.build_and_launch(program, stopOnEntry=True)
+ self.build_and_launch(program)
functions = ["foo"]
breakpoint_ids = self.set_function_breakpoints(functions)
self.assertEqual(len(breakpoint_ids), len(functions), "expect one breakpoint")
@@ -108,7 +108,7 @@ def test_modules_dsym(self):
@skipIfWindows
def test_compile_units(self):
program = self.getBuildArtifact("a.out")
- self.build_and_launch(program, stopOnEntry=True)
+ self.build_and_launch(program)
source = "main.cpp"
main_source_path = self.getSourcePath(source)
breakpoint1_line = line_number(source, "// breakpoint 1")
diff --git a/lldb/test/API/tools/lldb-dap/repl-mode/TestDAP_repl_mode_detection.py b/lldb/test/API/tools/lldb-dap/repl-mode/TestDAP_repl_mode_detection.py
index 81edcdf4bd0f9..c6f59949d668e 100644
--- a/lldb/test/API/tools/lldb-dap/repl-mode/TestDAP_repl_mode_detection.py
+++ b/lldb/test/API/tools/lldb-dap/repl-mode/TestDAP_repl_mode_detection.py
@@ -20,7 +20,7 @@ def assertEvaluate(self, expression, regex):
def test_completions(self):
program = self.getBuildArtifact("a.out")
- self.build_and_lau...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/140331
More information about the lldb-commits
mailing list