xref: /llvm-project/lldb/test/API/commands/process/attach/TestProcessAttach.py (revision 096c530ab3ea5c96526451181117f30db17b4b1d)
199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest process attach.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprecht
699451b44SJordan Rupprechtimport os
799451b44SJordan Rupprechtimport lldb
899451b44SJordan Rupprechtimport shutil
999451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
1099451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1199451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1299451b44SJordan Rupprecht
1399451b44SJordan Rupprechtexe_name = "ProcessAttach"  # Must match Makefile
1499451b44SJordan Rupprecht
1599451b44SJordan Rupprecht
1699451b44SJordan Rupprechtclass ProcessAttachTestCase(TestBase):
1799451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
1899451b44SJordan Rupprecht
19dbfdb139SMichał Górny    def setUp(self):
20dbfdb139SMichał Górny        # Call super's setUp().
21dbfdb139SMichał Górny        TestBase.setUp(self)
22dbfdb139SMichał Górny        # Find the line number to break for main.c.
232238dcc3SJonas Devlieghere        self.line = line_number("main.cpp", "// Waiting to be attached...")
24dbfdb139SMichał Górny
2599451b44SJordan Rupprecht    @skipIfiOSSimulator
2699451b44SJordan Rupprecht    def test_attach_to_process_by_id(self):
2799451b44SJordan Rupprecht        """Test attach by process id"""
2899451b44SJordan Rupprecht        self.build()
2999451b44SJordan Rupprecht        exe = self.getBuildArtifact(exe_name)
3099451b44SJordan Rupprecht
3199451b44SJordan Rupprecht        # Spawn a new process
3299451b44SJordan Rupprecht        popen = self.spawnSubprocess(exe)
3399451b44SJordan Rupprecht
3499451b44SJordan Rupprecht        self.runCmd("process attach -p " + str(popen.pid))
3599451b44SJordan Rupprecht
3699451b44SJordan Rupprecht        target = self.dbg.GetSelectedTarget()
3799451b44SJordan Rupprecht
3899451b44SJordan Rupprecht        process = target.GetProcess()
3999451b44SJordan Rupprecht        self.assertTrue(process, PROCESS_IS_VALID)
4099451b44SJordan Rupprecht
412303391dSJim Ingham    @skipIfiOSSimulator
422303391dSJim Ingham    def test_attach_to_process_by_id_autocontinue(self):
432303391dSJim Ingham        """Test attach by process id"""
442303391dSJim Ingham        self.build()
452303391dSJim Ingham        exe = self.getBuildArtifact(exe_name)
462303391dSJim Ingham
472303391dSJim Ingham        # Spawn a new process
482303391dSJim Ingham        popen = self.spawnSubprocess(exe)
492303391dSJim Ingham
502303391dSJim Ingham        self.runCmd("process attach -c -p " + str(popen.pid))
512303391dSJim Ingham
522303391dSJim Ingham        target = self.dbg.GetSelectedTarget()
532303391dSJim Ingham
542303391dSJim Ingham        process = target.GetProcess()
552303391dSJim Ingham        self.assertTrue(process, PROCESS_IS_VALID)
562303391dSJim Ingham        self.assertTrue(process.GetState(), lldb.eStateRunning)
572303391dSJim Ingham
5834714553SStella Stamenova    @skipIfWindows  # This is flakey on Windows AND when it fails, it hangs: llvm.org/pr48806
5999451b44SJordan Rupprecht    def test_attach_to_process_from_different_dir_by_id(self):
6099451b44SJordan Rupprecht        """Test attach by process id"""
6199451b44SJordan Rupprecht        newdir = self.getBuildArtifact("newdir")
6299451b44SJordan Rupprecht        try:
6399451b44SJordan Rupprecht            os.mkdir(newdir)
6499451b44SJordan Rupprecht        except OSError as e:
6599451b44SJordan Rupprecht            if e.errno != os.errno.EEXIST:
6699451b44SJordan Rupprecht                raise
6799451b44SJordan Rupprecht        testdir = self.getBuildDir()
682238dcc3SJonas Devlieghere        exe = os.path.join(newdir, "proc_attach")
692238dcc3SJonas Devlieghere        self.buildProgram("main.cpp", exe)
7099451b44SJordan Rupprecht        self.addTearDownHook(lambda: shutil.rmtree(newdir))
7199451b44SJordan Rupprecht
7299451b44SJordan Rupprecht        # Spawn a new process
7399451b44SJordan Rupprecht        popen = self.spawnSubprocess(exe)
7499451b44SJordan Rupprecht
7599451b44SJordan Rupprecht        os.chdir(newdir)
76*74338bfeSJim Ingham        sourcedir = self.getSourceDir()
77*74338bfeSJim Ingham        self.addTearDownHook(lambda: os.chdir(sourcedir))
7899451b44SJordan Rupprecht        self.runCmd("process attach -p " + str(popen.pid))
7999451b44SJordan Rupprecht
8099451b44SJordan Rupprecht        target = self.dbg.GetSelectedTarget()
8199451b44SJordan Rupprecht
8299451b44SJordan Rupprecht        process = target.GetProcess()
8399451b44SJordan Rupprecht        self.assertTrue(process, PROCESS_IS_VALID)
8499451b44SJordan Rupprecht
8599451b44SJordan Rupprecht    def test_attach_to_process_by_name(self):
8699451b44SJordan Rupprecht        """Test attach by process name"""
8799451b44SJordan Rupprecht        self.build()
8899451b44SJordan Rupprecht        exe = self.getBuildArtifact(exe_name)
8999451b44SJordan Rupprecht
9099451b44SJordan Rupprecht        # Spawn a new process
9199451b44SJordan Rupprecht        popen = self.spawnSubprocess(exe)
9299451b44SJordan Rupprecht
9399451b44SJordan Rupprecht        self.runCmd("process attach -n " + exe_name)
9499451b44SJordan Rupprecht
9599451b44SJordan Rupprecht        target = self.dbg.GetSelectedTarget()
9699451b44SJordan Rupprecht
9799451b44SJordan Rupprecht        process = target.GetProcess()
9899451b44SJordan Rupprecht        self.assertTrue(process, PROCESS_IS_VALID)
9999451b44SJordan Rupprecht
10058917054SStella Stamenova    @skipIfWindows  # This test is flaky on Windows
10199562332SMichał Górny    @expectedFailureNetBSD
102dbfdb139SMichał Górny    def test_attach_to_process_by_id_correct_executable_offset(self):
103dbfdb139SMichał Górny        """
104dbfdb139SMichał Górny        Test that after attaching to a process the executable offset
105dbfdb139SMichał Górny        is determined correctly on FreeBSD.  This is a regression test
106dbfdb139SMichał Górny        for dyld plugin getting the correct executable path,
107dbfdb139SMichał Górny        and therefore being able to identify it in the module list.
108dbfdb139SMichał Górny        """
109dbfdb139SMichał Górny
110dbfdb139SMichał Górny        self.build()
111dbfdb139SMichał Górny        exe = self.getBuildArtifact(exe_name)
112dbfdb139SMichał Górny
113dbfdb139SMichał Górny        # In order to reproduce, we must spawn using a relative path
114dbfdb139SMichał Górny        popen = self.spawnSubprocess(os.path.relpath(exe))
115dbfdb139SMichał Górny
116dbfdb139SMichał Górny        self.runCmd("process attach -p " + str(popen.pid))
117dbfdb139SMichał Górny
1180fd813cfSAdrian Prantl        # Make sure we did not attach too early.
119dbfdb139SMichał Górny        lldbutil.run_break_set_by_file_and_line(
1202238dcc3SJonas Devlieghere            self, "main.cpp", self.line, num_expected_locations=1, loc_exact=False
1212238dcc3SJonas Devlieghere        )
122dbfdb139SMichał Górny        self.runCmd("process continue")
12326ba774fSAdrian Prantl        self.expect("v g_val", substrs=["12345"])
124dbfdb139SMichał Górny
12599451b44SJordan Rupprecht    def tearDown(self):
12699451b44SJordan Rupprecht        # Destroy process before TestBase.tearDown()
12799451b44SJordan Rupprecht        self.dbg.GetSelectedTarget().GetProcess().Destroy()
12899451b44SJordan Rupprecht
12999451b44SJordan Rupprecht        # Call super's tearDown().
13099451b44SJordan Rupprecht        TestBase.tearDown(self)
131