| """ |
| Test lldb-dap "port" configuration to "attach" request |
| """ |
| |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test import lldbplatformutil |
| from lldbgdbserverutils import Pipe |
| import lldbdap_testcase |
| import lldb |
| |
| |
| @skip(bugnumber="https://github.com/llvm/llvm-project/issues/138803") |
| class TestDAP_attachByPortNum(lldbdap_testcase.DAPTestCaseBase): |
| def set_and_hit_breakpoint(self, continueToExit=True): |
| self.dap_server.wait_for_stopped() |
| |
| source = "main.c" |
| breakpoint1_line = line_number(source, "// breakpoint 1") |
| lines = [breakpoint1_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) |
| if continueToExit: |
| self.continue_to_exit() |
| |
| def get_debug_server_command_line_args(self): |
| args = [] |
| if lldbplatformutil.getPlatform() == "linux": |
| args = ["gdbserver"] |
| if lldb.remote_platform: |
| args += ["*:0"] |
| else: |
| args += ["localhost:0"] |
| return args |
| |
| def get_debug_server_pipe(self): |
| pipe = Pipe(self.getBuildDir()) |
| self.addTearDownHook(lambda: pipe.close()) |
| pipe.finish_connection(self.DEFAULT_TIMEOUT) |
| return pipe |
| |
| @skipIfWindows |
| @skipIfNetBSD |
| def test_by_port(self): |
| """ |
| Tests attaching to a process by port. |
| """ |
| program = self.build_and_create_debug_adapter_for_attach() |
| |
| debug_server_tool = self.getBuiltinDebugServerTool() |
| |
| pipe = self.get_debug_server_pipe() |
| args = self.get_debug_server_command_line_args() |
| args += [program] |
| args += ["--named-pipe", pipe.name] |
| |
| self.process = self.spawnSubprocess( |
| debug_server_tool, args, install_remote=False |
| ) |
| |
| # Read the port number from the debug server pipe. |
| port = pipe.read(10, self.DEFAULT_TIMEOUT) |
| # Trim null byte, convert to int |
| port = int(port[:-1]) |
| self.assertIsNotNone( |
| port, " Failed to read the port number from debug server pipe" |
| ) |
| |
| self.attach( |
| program=program, |
| gdbRemotePort=port, |
| sourceInitFile=True, |
| stopOnEntry=True, |
| ) |
| self.set_and_hit_breakpoint(continueToExit=True) |
| |
| @skipIfWindows |
| @skipIfNetBSD |
| def test_fails_if_both_port_and_pid_are_set(self): |
| """ |
| Tests attaching to a process by process ID and port number. |
| """ |
| program = self.build_and_create_debug_adapter_for_attach() |
| |
| # It is not necessary to launch "lldb-server" to obtain the actual port |
| # and pid for attaching. However, when providing the port number and pid |
| # directly, "lldb-dap" throws an error message, which is expected. So, |
| # used random pid and port numbers here. |
| |
| pid = 1354 |
| port = 1234 |
| |
| response = self.attach( |
| program=program, |
| pid=pid, |
| gdbRemotePort=port, |
| sourceInitFile=True, |
| waitForResponse=True, |
| ) |
| self.assertFalse( |
| response["success"], "The user can't specify both pid and port" |
| ) |
| |
| @skipIfWindows |
| @skipIfNetBSD |
| def test_by_invalid_port(self): |
| """ |
| Tests attaching to a process by invalid port number 0. |
| """ |
| program = self.build_and_create_debug_adapter_for_attach() |
| |
| port = 0 |
| response = self.attach( |
| program=program, |
| gdbRemotePort=port, |
| sourceInitFile=True, |
| waitForResponse=True, |
| ) |
| self.assertFalse( |
| response["success"], |
| "The user can't attach with invalid port (%s)" % port, |
| ) |
| |
| @skipIfWindows |
| @skipIfNetBSD |
| def test_by_illegal_port(self): |
| """ |
| Tests attaching to a process by illegal/greater port number 65536 |
| """ |
| program = self.build_and_create_debug_adapter_for_attach() |
| |
| port = 65536 |
| args = [program] |
| debug_server_tool = self.getBuiltinDebugServerTool() |
| self.process = self.spawnSubprocess( |
| debug_server_tool, args, install_remote=False |
| ) |
| |
| response = self.attach( |
| program=program, |
| gdbRemotePort=port, |
| sourceInitFile=True, |
| waitForResponse=True, |
| ) |
| self.assertFalse( |
| response["success"], |
| "The user can't attach with illegal port (%s)" % port, |
| ) |