summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaphael Isemann <teemperor@gmail.com>2019-07-11 19:27:33 +0000
committerRaphael Isemann <teemperor@gmail.com>2019-07-11 19:27:33 +0000
commit2bc8ab685289b7681e6ed0fa54f55bc505b47450 (patch)
treedbf6ed606d05663a529aba41d7b9b2fb774c60be
parent60b71ce0e4f23e2dd73c58c7c0f15df6702ed188 (diff)
downloadbcm5719-llvm-2bc8ab685289b7681e6ed0fa54f55bc505b47450.tar.gz
bcm5719-llvm-2bc8ab685289b7681e6ed0fa54f55bc505b47450.zip
[lldb] Make TestDeletedExecutable more reliable
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
-rw-r--r--lldb/packages/Python/lldbsuite/test/functionalities/deleted-executable/TestDeletedExecutable.py18
-rw-r--r--lldb/packages/Python/lldbsuite/test/functionalities/deleted-executable/main.cpp12
2 files changed, 25 insertions, 5 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/deleted-executable/TestDeletedExecutable.py b/lldb/packages/Python/lldbsuite/test/functionalities/deleted-executable/TestDeletedExecutable.py
index 3657dd744ca..8364f91c74a 100644
--- a/lldb/packages/Python/lldbsuite/test/functionalities/deleted-executable/TestDeletedExecutable.py
+++ b/lldb/packages/Python/lldbsuite/test/functionalities/deleted-executable/TestDeletedExecutable.py
@@ -1,5 +1,5 @@
"""
-Test process attach/resume.
+Test process attach when executable was deleted.
"""
from __future__ import print_function
@@ -24,8 +24,22 @@ class TestDeletedExecutable(TestBase):
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))
diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/deleted-executable/main.cpp b/lldb/packages/Python/lldbsuite/test/functionalities/deleted-executable/main.cpp
index ad5d18732ea..af00ac263cc 100644
--- a/lldb/packages/Python/lldbsuite/test/functionalities/deleted-executable/main.cpp
+++ b/lldb/packages/Python/lldbsuite/test/functionalities/deleted-executable/main.cpp
@@ -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));
}
OpenPOWER on IntegriCloud