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