1*99451b44SJordan Rupprecht""" 2*99451b44SJordan RupprechtTest process attach when executable was deleted. 3*99451b44SJordan Rupprecht""" 4*99451b44SJordan Rupprecht 5*99451b44SJordan Rupprecht 6*99451b44SJordan Rupprecht 7*99451b44SJordan Rupprechtimport os 8*99451b44SJordan Rupprechtimport lldb 9*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 10*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 11*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 12*99451b44SJordan Rupprecht 13*99451b44SJordan Rupprechtclass TestDeletedExecutable(TestBase): 14*99451b44SJordan Rupprecht 15*99451b44SJordan Rupprecht mydir = TestBase.compute_mydir(__file__) 16*99451b44SJordan Rupprecht NO_DEBUG_INFO_TESTCASE = True 17*99451b44SJordan Rupprecht 18*99451b44SJordan Rupprecht @skipIfWindows # cannot delete a running executable 19*99451b44SJordan Rupprecht @expectedFailureAll(oslist=["linux"], 20*99451b44SJordan Rupprecht triple=no_match('aarch64-.*-android')) 21*99451b44SJordan Rupprecht # determining the architecture of the process fails 22*99451b44SJordan Rupprecht @expectedFailureNetBSD 23*99451b44SJordan Rupprecht def test(self): 24*99451b44SJordan Rupprecht self.build() 25*99451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 26*99451b44SJordan Rupprecht 27*99451b44SJordan Rupprecht # Use a file as a synchronization point between test and inferior. 28*99451b44SJordan Rupprecht pid_file_path = lldbutil.append_to_process_working_directory(self, 29*99451b44SJordan Rupprecht "token_pid_%d" % (int(os.getpid()))) 30*99451b44SJordan Rupprecht self.addTearDownHook( 31*99451b44SJordan Rupprecht lambda: self.run_platform_command( 32*99451b44SJordan Rupprecht "rm %s" % 33*99451b44SJordan Rupprecht (pid_file_path))) 34*99451b44SJordan Rupprecht 35*99451b44SJordan Rupprecht # Spawn a new process 36*99451b44SJordan Rupprecht popen = self.spawnSubprocess(exe, [pid_file_path]) 37*99451b44SJordan Rupprecht self.addTearDownHook(self.cleanupSubprocesses) 38*99451b44SJordan Rupprecht 39*99451b44SJordan Rupprecht # Wait until process has fully started up. 40*99451b44SJordan Rupprecht pid = lldbutil.wait_for_file_on_target(self, pid_file_path) 41*99451b44SJordan Rupprecht 42*99451b44SJordan Rupprecht # Now we can safely remove the executable and test if we can attach. 43*99451b44SJordan Rupprecht os.remove(exe) 44*99451b44SJordan Rupprecht 45*99451b44SJordan Rupprecht self.runCmd("process attach -p " + str(popen.pid)) 46*99451b44SJordan Rupprecht self.runCmd("kill") 47