mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-27 23:38:59 -04:00

Summary: It seems that calling Popen can return to the caller before the started process has read all the needed information from its executable. This means that in case we delete the executable while the process is still starting up, this test will create a zombie process which in turn leads to a failing test. On my macOS system this happens quite frequently. This patch fixes this by letting the test synchronize with the inferior after it has started up. Reviewers: davide Reviewed By: davide Subscribers: labath, friss, lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D64546 llvm-svn: 365813
47 lines
1.4 KiB
Python
47 lines
1.4 KiB
Python
"""
|
|
Test process attach when executable was deleted.
|
|
"""
|
|
|
|
from __future__ import print_function
|
|
|
|
|
|
import os
|
|
import time
|
|
import lldb
|
|
from lldbsuite.test.decorators import *
|
|
from lldbsuite.test.lldbtest import *
|
|
from lldbsuite.test import lldbutil
|
|
|
|
class TestDeletedExecutable(TestBase):
|
|
|
|
mydir = TestBase.compute_mydir(__file__)
|
|
NO_DEBUG_INFO_TESTCASE = True
|
|
|
|
@skipIfWindows # cannot delete a running executable
|
|
@expectedFailureAll(oslist=["linux"]) # determining the architecture of the process fails
|
|
@expectedFailureNetBSD
|
|
def test(self):
|
|
self.build()
|
|
exe = self.getBuildArtifact("a.out")
|
|
|
|
# Use a file as a synchronization point between test and inferior.
|
|
pid_file_path = lldbutil.append_to_process_working_directory(self,
|
|
"token_pid_%d" % (int(os.getpid())))
|
|
self.addTearDownHook(
|
|
lambda: self.run_platform_command(
|
|
"rm %s" %
|
|
(pid_file_path)))
|
|
|
|
# Spawn a new process
|
|
popen = self.spawnSubprocess(exe, [pid_file_path])
|
|
self.addTearDownHook(self.cleanupSubprocesses)
|
|
|
|
# Wait until process has fully started up.
|
|
pid = lldbutil.wait_for_file_on_target(self, pid_file_path)
|
|
|
|
# Now we can safely remove the executable and test if we can attach.
|
|
os.remove(exe)
|
|
|
|
self.runCmd("process attach -p " + str(popen.pid))
|
|
self.runCmd("kill")
|