@@ -117,6 +117,13 @@ class DebuggerCrossConfig:
% (self._target_tcp_port_check_cmd(), cleanup, self.DEBUG_SERVER_NAME,
self.debug_server_port))
+ def _target_wait_for_process_exit_cmd(self, pid_var):
+ return (
+ "_w=0; while kill -0 \\$_%s 2>/dev/null; do _w=\\$((_w+1)); "
+ "[ \\$_w -lt 100 ] || { echo %s did not stop >&2; exit 1; }; "
+ "sleep 0.1; done;"
+ % (pid_var, self.DEBUG_SERVER_NAME))
+
def initialize(self):
"""Called after construction to generate any required config files."""
pass
@@ -24,9 +24,13 @@ class GdbCrossConfigNone(GdbCrossConfig):
"""Kill a gdbserver process"""
# This is the usual behavior: gdbserver is stopped on demand
if server_mode == DebuggerServerModes.MULTI:
- gdbserver_cmd_stop = "test -f %s && kill \\$(cat %s);" % (
- self._gdbserver_pid_file(server_mode), self._gdbserver_pid_file(server_mode))
- gdbserver_cmd_stop += " rm -rf %s" % self._gdbserver_tmp_dir(server_mode)
+ pid_file = self._gdbserver_pid_file(server_mode)
+ gdbserver_cmd_stop = "if test -f %s; then _gdbserver_pid=\\$(cat %s); " % (
+ pid_file, pid_file)
+ gdbserver_cmd_stop += "kill \\$_gdbserver_pid 2>/dev/null; "
+ gdbserver_cmd_stop += self._target_wait_for_process_exit_cmd(
+ "gdbserver_pid")
+ gdbserver_cmd_stop += " fi; rm -rf %s" % self._gdbserver_tmp_dir(server_mode)
# This is unexpected since gdbserver should terminate after each debug session
# Just kill all gdbserver instances to keep it simple
else:
@@ -169,8 +173,11 @@ class LldbServerConfigNone(LldbServerConfig):
if server_mode == DebuggerServerModes.MULTI:
pid_file = self._lldb_server_pid_file(server_mode)
tmp_dir = self._lldb_server_tmp_dir(server_mode)
- cmd = ("test -f %(pf)s && kill \\$(cat %(pf)s) 2>/dev/null; rm -rf %(td)s"
- % {'pf': pid_file, 'td': tmp_dir})
+ cmd = "if test -f %s; then _lldb_server_pid=\\$(cat %s); " % (
+ pid_file, pid_file)
+ cmd += "kill \\$_lldb_server_pid 2>/dev/null; "
+ cmd += self._target_wait_for_process_exit_cmd("lldb_server_pid")
+ cmd += " fi; rm -rf %s" % tmp_dir
else:
cmd = "killall lldb-server 2>/dev/null || true"
return "\"/bin/sh -c '" + cmd + "'\""