xref: /llvm-project/lldb/test/API/tools/lldb-server/TestGdbRemoteAttach.py (revision 9c2468821ec51defd09c246fea4a47886fff8c01)
199451b44SJordan Rupprechtimport gdbremote_testcase
299451b44SJordan Rupprechtimport lldbgdbserverutils
399451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
499451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
599451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
699451b44SJordan Rupprecht
799451b44SJordan Rupprecht
82238dcc3SJonas Devlieghereclass TestGdbRemoteAttach(gdbremote_testcase.GdbRemoteTestCaseBase):
976a718eeSPavel Labath    def test_attach_with_vAttach(self):
1076a718eeSPavel Labath        self.build()
1176a718eeSPavel Labath        self.set_inferior_startup_attach_manually()
1276a718eeSPavel Labath
1399451b44SJordan Rupprecht        # Start the inferior, start the debug monitor, nothing is attached yet.
142238dcc3SJonas Devlieghere        procs = self.prep_debug_monitor_and_inferior(inferior_args=["sleep:60"])
1599451b44SJordan Rupprecht        self.assertIsNotNone(procs)
1699451b44SJordan Rupprecht
1799451b44SJordan Rupprecht        # Make sure the target process has been launched.
1899451b44SJordan Rupprecht        inferior = procs.get("inferior")
1999451b44SJordan Rupprecht        self.assertIsNotNone(inferior)
20*9c246882SJordan Rupprecht        self.assertGreater(inferior.pid, 0)
212238dcc3SJonas Devlieghere        self.assertTrue(lldbgdbserverutils.process_is_running(inferior.pid, True))
2299451b44SJordan Rupprecht
2399451b44SJordan Rupprecht        # Add attach packets.
242238dcc3SJonas Devlieghere        self.test_sequence.add_log_lines(
252238dcc3SJonas Devlieghere            [
2699451b44SJordan Rupprecht                # Do the attach.
2799451b44SJordan Rupprecht                "read packet: $vAttach;{:x}#00".format(inferior.pid),
2899451b44SJordan Rupprecht                # Expect a stop notification from the attach.
292238dcc3SJonas Devlieghere                {
302238dcc3SJonas Devlieghere                    "direction": "send",
3199451b44SJordan Rupprecht                    "regex": r"^\$T([0-9a-fA-F]{2})[^#]*#[0-9a-fA-F]{2}$",
322238dcc3SJonas Devlieghere                    "capture": {1: "stop_signal_hex"},
332238dcc3SJonas Devlieghere                },
342238dcc3SJonas Devlieghere            ],
352238dcc3SJonas Devlieghere            True,
362238dcc3SJonas Devlieghere        )
3799451b44SJordan Rupprecht        self.add_process_info_collection_packets()
3899451b44SJordan Rupprecht
3999451b44SJordan Rupprecht        # Run the stream
4099451b44SJordan Rupprecht        context = self.expect_gdbremote_sequence()
4199451b44SJordan Rupprecht        self.assertIsNotNone(context)
4299451b44SJordan Rupprecht
4399451b44SJordan Rupprecht        # Gather process info response
4499451b44SJordan Rupprecht        process_info = self.parse_process_info_response(context)
4599451b44SJordan Rupprecht        self.assertIsNotNone(process_info)
4699451b44SJordan Rupprecht
4799451b44SJordan Rupprecht        # Ensure the process id matches what we expected.
482238dcc3SJonas Devlieghere        pid_text = process_info.get("pid", None)
4999451b44SJordan Rupprecht        self.assertIsNotNone(pid_text)
5099451b44SJordan Rupprecht        reported_pid = int(pid_text, base=16)
5199451b44SJordan Rupprecht        self.assertEqual(reported_pid, inferior.pid)
52