Skip to content

Commit

Permalink
[lldb] Make TestDeletedExecutable more reliable
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Teemperor committed Jul 11, 2019
1 parent 60b71ce commit 2bc8ab6
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 5 deletions.
@@ -1,5 +1,5 @@
"""
Test process attach/resume.
Test process attach when executable was deleted.
"""

from __future__ import print_function
Expand All @@ -24,8 +24,22 @@ def test(self):
self.build()
exe = self.getBuildArtifact("a.out")

popen = self.spawnSubprocess(exe)
# 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))
Expand Down
@@ -1,9 +1,15 @@
#include <chrono>
#include <fstream>
#include <thread>

int main(int argc, char const *argv[])
{
int main(int argc, char const *argv[]) {
lldb_enable_attach();

std::this_thread::sleep_for(std::chrono::seconds(30));
{
// Create file to signal that this process has started up.
std::ofstream f;
f.open(argv[1]);
}

std::this_thread::sleep_for(std::chrono::seconds(60));
}

0 comments on commit 2bc8ab6

Please sign in to comment.