--- /dev/null
+import unittest2
+
+import gdbremote_testcase
+import lldbgdbserverutils
+
+from lldbtest import *
+
+class TestGdbRemoteKill(gdbremote_testcase.GdbRemoteTestCaseBase):
+ def attach_commandline_kill_after_initial_stop(self):
+ procs = self.prep_debug_monitor_and_inferior()
+ self.test_sequence.add_log_lines([
+ "read packet: $k#6b",
+ {"direction":"send", "regex":r"^\$X[0-9a-fA-F]+([^#]*)#[0-9A-Fa-f]{2}" },
+ ], True)
+
+ if self.stub_sends_two_stop_notifications_on_kill:
+ # Add an expectation for a second X result for stubs that send two of these.
+ self.test_sequence.add_log_lines([
+ {"direction":"send", "regex":r"^\$X[0-9a-fA-F]+([^#]*)#[0-9A-Fa-f]{2}" },
+ ], True)
+
+ self.expect_gdbremote_sequence()
+
+ # Wait a moment for completed and now-detached inferior process to clear.
+ time.sleep(1)
+
+ # Process should be dead now. Reap results.
+ poll_result = procs["inferior"].poll()
+ self.assertIsNotNone(poll_result)
+
+ # Where possible, verify at the system level that the process is not running.
+ self.assertFalse(lldbgdbserverutils.process_is_running(procs["inferior"].pid, False))
+
+ @debugserver_test
+ @dsym_test
+ def test_attach_commandline_kill_after_initial_stop_debugserver_dsym(self):
+ self.init_debugserver_test()
+ self.buildDsym()
+ self.set_inferior_startup_attach()
+ self.attach_commandline_kill_after_initial_stop()
+
+ @llgs_test
+ @dwarf_test
+ def test_attach_commandline_kill_after_initial_stop_llgs_dwarf(self):
+ self.init_llgs_test()
+ self.buildDwarf()
+ self.set_inferior_startup_attach()
+ self.attach_commandline_kill_after_initial_stop()
+
self.set_inferior_startup_attach()
self.attach_commandline_continue_app_exits()
- def attach_commandline_kill_after_initial_stop(self):
- procs = self.prep_debug_monitor_and_inferior()
- self.test_sequence.add_log_lines(
- ["read packet: $k#6b",
- "send packet: $X09#00"],
- True)
- self.expect_gdbremote_sequence()
-
- # Wait a moment for completed and now-detached inferior process to clear.
- time.sleep(1)
-
- # Process should be dead now. Reap results.
- poll_result = procs["inferior"].poll()
- self.assertIsNotNone(poll_result)
-
- # Where possible, verify at the system level that the process is not running.
- self.assertFalse(lldbgdbserverutils.process_is_running(procs["inferior"].pid, False))
-
- @debugserver_test
- @dsym_test
- def test_attach_commandline_kill_after_initial_stop_debugserver_dsym(self):
- self.init_debugserver_test()
- self.buildDsym()
- self.set_inferior_startup_attach()
- self.attach_commandline_kill_after_initial_stop()
-
- @llgs_test
- @dwarf_test
- def test_attach_commandline_kill_after_initial_stop_llgs_dwarf(self):
- self.init_llgs_test()
- self.buildDwarf()
- self.set_inferior_startup_attach()
- self.attach_commandline_kill_after_initial_stop()
-
def qRegisterInfo_returns_one_valid_result(self):
server = self.connect_to_debug_monitor()
self.assertIsNotNone(server)
self.named_pipe_path = None
self.named_pipe = None
self.named_pipe_fd = None
+ self.stub_sends_two_stop_notifications_on_kill = False
def get_next_port(self):
return 12000 + random.randint(0,3999)
self.debug_monitor_extra_args = " --log-file=/tmp/packets-{}.log --log-flags=0x800000".format(self._testMethodName)
if use_named_pipe:
(self.named_pipe_path, self.named_pipe, self.named_pipe_fd) = self.create_named_pipe()
+ # The debugserver stub has a race on handling the 'k' command, so it sends an X09 right away, then sends the real X notification
+ # when the process truly dies.
+ self.stub_sends_two_stop_notifications_on_kill = True
def create_socket(self):
sock = socket.socket()