forked from platformio/platformio-core
Add support for debugging server "ready_pattern"
This commit is contained in:
@ -125,7 +125,8 @@ def validate_debug_options(cmd_ctx, env_options):
|
||||
server_options["executable"] = server_options["arguments"][0]
|
||||
server_options["arguments"] = server_options["arguments"][1:]
|
||||
elif "server" in tool_settings:
|
||||
server_package = tool_settings["server"].get("package")
|
||||
server_options = tool_settings["server"]
|
||||
server_package = server_options.get("package")
|
||||
server_package_dir = (
|
||||
platform.get_package_dir(server_package) if server_package else None
|
||||
)
|
||||
@ -134,15 +135,17 @@ def validate_debug_options(cmd_ctx, env_options):
|
||||
with_packages=[server_package], skip_default_package=True, silent=True
|
||||
)
|
||||
server_package_dir = platform.get_package_dir(server_package)
|
||||
server_options = dict(
|
||||
cwd=server_package_dir if server_package else None,
|
||||
executable=tool_settings["server"].get("executable"),
|
||||
arguments=[
|
||||
a.replace("$PACKAGE_DIR", server_package_dir)
|
||||
if server_package_dir
|
||||
else a
|
||||
for a in tool_settings["server"].get("arguments", [])
|
||||
],
|
||||
server_options.update(
|
||||
dict(
|
||||
cwd=server_package_dir if server_package else None,
|
||||
executable=server_options.get("executable"),
|
||||
arguments=[
|
||||
a.replace("$PACKAGE_DIR", server_package_dir)
|
||||
if server_package_dir
|
||||
else a
|
||||
for a in server_options.get("arguments", [])
|
||||
],
|
||||
)
|
||||
)
|
||||
|
||||
extra_cmds = _cleanup_cmds(env_options.get("debug_extra_cmds"))
|
||||
|
@ -35,6 +35,7 @@ class DebugServer(BaseProcess):
|
||||
self._debug_port = ":3333"
|
||||
self._transport = None
|
||||
self._process_ended = False
|
||||
self._ready = False
|
||||
|
||||
@defer.inlineCallbacks
|
||||
def spawn(self, patterns): # pylint: disable=too-many-branches
|
||||
@ -126,15 +127,7 @@ class DebugServer(BaseProcess):
|
||||
timeout = 10
|
||||
elapsed = 0
|
||||
delay = 1
|
||||
ready_delay = 0.5
|
||||
while (
|
||||
not self._process_ended
|
||||
and elapsed < timeout
|
||||
and (
|
||||
not self._last_activity
|
||||
or not (self._last_activity < (time.time() - ready_delay))
|
||||
)
|
||||
):
|
||||
while not self._ready and not self._process_ended and elapsed < timeout:
|
||||
yield self.async_sleep(delay)
|
||||
elapsed += delay
|
||||
|
||||
@ -151,6 +144,14 @@ class DebugServer(BaseProcess):
|
||||
super(DebugServer, self).outReceived(
|
||||
escape_gdbmi_stream("@", data) if is_gdbmi_mode() else data
|
||||
)
|
||||
if self._ready:
|
||||
return
|
||||
ready_pattern = self.debug_options.get("server", {}).get("ready_pattern")
|
||||
if ready_pattern:
|
||||
self._ready = ready_pattern.encode() in data
|
||||
else:
|
||||
ready_delay = 0.5
|
||||
self._ready = self._last_activity < (time.time() - ready_delay)
|
||||
|
||||
def processEnded(self, reason):
|
||||
self._process_ended = True
|
||||
|
Reference in New Issue
Block a user