From: Adrian Freihofer Date: Sun, 9 Aug 2026 09:35:52 +0000 (+0200) Subject: devtool: ide-sdk: wait for lldb-server readiness X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=335670e4c79182e793259fc30e4caa76297868ca;p=thirdparty%2Fopenembedded%2Fopenembedded-core.git devtool: ide-sdk: wait for lldb-server readiness Start lldb-server in the target background, record its PID, and wait for the listener before the generated MULTI pre-launch task returns. This ensures a client can connect only after lldb-server is accepting connections and preserves timeout cleanup. Move reusable TCP listener checks and bounded wait generation into DebuggerCrossConfig to make it reusable for GDB as well. Signed-off-by: Adrian Freihofer Signed-off-by: Richard Purdie --- diff --git a/scripts/lib/devtool/ide_plugins/__init__.py b/scripts/lib/devtool/ide_plugins/__init__.py index d50ba7bc65..deb6050907 100644 --- a/scripts/lib/devtool/ide_plugins/__init__.py +++ b/scripts/lib/devtool/ide_plugins/__init__.py @@ -97,6 +97,20 @@ class DebuggerCrossConfig: modes.append(DebuggerServerModes.ATTACH) return modes + def _target_tcp_port_check_cmd(self): + hex_port = "%04X" % self.debug_server_port + return "grep -q :%s /proc/net/tcp /proc/net/tcp6 2>/dev/null" % hex_port + + def _target_wait_for_tcp_port_cmd(self, pid_var=None): + cleanup = "" + if pid_var: + cleanup = "kill \\$_%s 2>/dev/null; " % pid_var + return ( + "_w=0; while ! %s; do _w=\\$((_w+1)); [ \\$_w -lt 100 ] || { " + "%secho %s did not start on port %s >&2; exit 1; }; sleep 0.1; done;" + % (self._target_tcp_port_check_cmd(), cleanup, self.DEBUG_SERVER_NAME, + self.debug_server_port)) + def initialize(self): """Called after construction to generate any required config files.""" pass @@ -197,6 +211,7 @@ class LldbServerConfig(DebuggerCrossConfig): The ATTACH mode is not supported because lldb-server platform does not take a PID argument; attaching is done client-side via 'process attach'. """ + DEBUG_SERVER_NAME = "lldb-server" def __init__(self, image_recipe, modified_recipe, binary, default_mode=DebuggerServerModes.MULTI): @@ -224,18 +239,17 @@ class LldbServerConfig(DebuggerCrossConfig): cmd = "cd /tmp && %s platform --one-shot --server --listen *:%s" % ( lldb_server, self.debug_server_port) elif mode == DebuggerServerModes.MULTI: - hex_port = "%04X" % self.debug_server_port pid_file = self._lldb_server_pid_file(mode) tmp_dir = self._lldb_server_tmp_dir(mode) log_file = self._lldb_server_log_file(mode) - cmd = "grep -q :%s /proc/net/tcp /proc/net/tcp6 2>/dev/null && exit 0; " % hex_port + cmd = self._target_tcp_port_check_cmd() + " && exit 0; " cmd += "mkdir -p %s; " % tmp_dir cmd += "cd %s; " % tmp_dir - cmd += "%s platform --server --listen *:%s > %s 2>&1 & " % ( + cmd += "%s platform --server --listen *:%s > %s 2>&1 & _lldb_server_pid=\\$!; " % ( lldb_server, self.debug_server_port, log_file) - cmd += "echo \\$! > %s; " % pid_file - cmd += "_w=0; while ! grep -q :%s /proc/net/tcp /proc/net/tcp6 2>/dev/null; " % hex_port - cmd += "do _w=\\$((_w+1)); [ \\$_w -lt 100 ] || { echo lldb-server did not start on port %s >&2; exit 1; }; sleep 0.1; done;" % self.debug_server_port + cmd += "echo \\$_lldb_server_pid > %s; " % pid_file + cmd += self._target_wait_for_tcp_port_cmd( + "lldb_server_pid") else: raise DevtoolError( "lldb-server does not support mode %s "