199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest process attach when executable was deleted. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprecht 699451b44SJordan Rupprecht 799451b44SJordan Rupprechtimport os 899451b44SJordan Rupprechtimport lldb 999451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 1099451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 1199451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1299451b44SJordan Rupprecht 1399451b44SJordan Rupprechtclass TestDeletedExecutable(TestBase): 1499451b44SJordan Rupprecht 1599451b44SJordan Rupprecht mydir = TestBase.compute_mydir(__file__) 1699451b44SJordan Rupprecht NO_DEBUG_INFO_TESTCASE = True 1799451b44SJordan Rupprecht 1899451b44SJordan Rupprecht @skipIfWindows # cannot delete a running executable 19*266c90feSMichał Górny @expectedFailureAll(oslist=["linux"], 2099451b44SJordan Rupprecht triple=no_match('aarch64-.*-android')) 2199451b44SJordan Rupprecht # determining the architecture of the process fails 22*266c90feSMichał Górny @expectedFailureAll(oslist=["freebsd"], bugnumber="llvm.org/pr48374") 232084330eSJonas Devlieghere @skipIfReproducer # File synchronization is not supported during replay. 2499451b44SJordan Rupprecht def test(self): 2599451b44SJordan Rupprecht self.build() 2699451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 2799451b44SJordan Rupprecht 2899451b44SJordan Rupprecht # Use a file as a synchronization point between test and inferior. 2999451b44SJordan Rupprecht pid_file_path = lldbutil.append_to_process_working_directory(self, 3099451b44SJordan Rupprecht "token_pid_%d" % (int(os.getpid()))) 3199451b44SJordan Rupprecht self.addTearDownHook( 3299451b44SJordan Rupprecht lambda: self.run_platform_command( 3399451b44SJordan Rupprecht "rm %s" % 3499451b44SJordan Rupprecht (pid_file_path))) 3599451b44SJordan Rupprecht 3699451b44SJordan Rupprecht # Spawn a new process 3799451b44SJordan Rupprecht popen = self.spawnSubprocess(exe, [pid_file_path]) 3899451b44SJordan Rupprecht 3999451b44SJordan Rupprecht # Wait until process has fully started up. 4099451b44SJordan Rupprecht pid = lldbutil.wait_for_file_on_target(self, pid_file_path) 4199451b44SJordan Rupprecht 4299451b44SJordan Rupprecht # Now we can safely remove the executable and test if we can attach. 4399451b44SJordan Rupprecht os.remove(exe) 4499451b44SJordan Rupprecht 4599451b44SJordan Rupprecht self.runCmd("process attach -p " + str(popen.pid)) 4699451b44SJordan Rupprecht self.runCmd("kill") 47