Author: teemperor
Date: Thu Jul 11 12:27:33 2019
New Revision: 365813

URL: http://llvm.org/viewvc/llvm-project?rev=365813&view=rev
Log:
[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

Modified:
    
lldb/trunk/packages/Python/lldbsuite/test/functionalities/deleted-executable/TestDeletedExecutable.py
    
lldb/trunk/packages/Python/lldbsuite/test/functionalities/deleted-executable/main.cpp

Modified: 
lldb/trunk/packages/Python/lldbsuite/test/functionalities/deleted-executable/TestDeletedExecutable.py
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/deleted-executable/TestDeletedExecutable.py?rev=365813&r1=365812&r2=365813&view=diff
==============================================================================
--- 
lldb/trunk/packages/Python/lldbsuite/test/functionalities/deleted-executable/TestDeletedExecutable.py
 (original)
+++ 
lldb/trunk/packages/Python/lldbsuite/test/functionalities/deleted-executable/TestDeletedExecutable.py
 Thu Jul 11 12:27:33 2019
@@ -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))

Modified: 
lldb/trunk/packages/Python/lldbsuite/test/functionalities/deleted-executable/main.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/deleted-executable/main.cpp?rev=365813&r1=365812&r2=365813&view=diff
==============================================================================
--- 
lldb/trunk/packages/Python/lldbsuite/test/functionalities/deleted-executable/main.cpp
 (original)
+++ 
lldb/trunk/packages/Python/lldbsuite/test/functionalities/deleted-executable/main.cpp
 Thu Jul 11 12:27:33 2019
@@ -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));
 }


_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to