[Lldb-commits] [lldb] f659bf0 - [lldb] [test] Add synchronization fix Subprocess test flakiness
Michał Górny via lldb-commits
lldb-commits at lists.llvm.org
Fri Sep 10 00:11:30 PDT 2021
Author: Michał Górny
Date: 2021-09-10T09:11:08+02:00
New Revision: f659bf00b4c0f33947bbce19113ac7cd28e5da86
URL: https://github.com/llvm/llvm-project/commit/f659bf00b4c0f33947bbce19113ac7cd28e5da86
DIFF: https://github.com/llvm/llvm-project/commit/f659bf00b4c0f33947bbce19113ac7cd28e5da86.diff
LOG: [lldb] [test] Add synchronization fix Subprocess test flakiness
Add synchronization routines to ensure that Subprocess tests output
in a predictable order, and all test strings are output before the tests
terminate.
Differential Revision: https://reviews.llvm.org/D109495
Added:
Modified:
lldb/test/Shell/Subprocess/Inputs/fork.cpp
lldb/test/Shell/Subprocess/clone-follow-child-softbp.test
lldb/test/Shell/Subprocess/clone-follow-child-wp.test
lldb/test/Shell/Subprocess/clone-follow-child.test
lldb/test/Shell/Subprocess/clone-follow-parent-softbp.test
lldb/test/Shell/Subprocess/clone-follow-parent-wp.test
lldb/test/Shell/Subprocess/clone-follow-parent.test
lldb/test/Shell/Subprocess/fork-follow-child-softbp.test
lldb/test/Shell/Subprocess/fork-follow-child-wp.test
lldb/test/Shell/Subprocess/fork-follow-child.test
lldb/test/Shell/Subprocess/fork-follow-parent-softbp.test
lldb/test/Shell/Subprocess/fork-follow-parent-wp.test
lldb/test/Shell/Subprocess/fork-follow-parent.test
lldb/test/Shell/Subprocess/vfork-follow-child-softbp.test
lldb/test/Shell/Subprocess/vfork-follow-child-wp.test
lldb/test/Shell/Subprocess/vfork-follow-child.test
lldb/test/Shell/Subprocess/vfork-follow-parent-softbp.test
lldb/test/Shell/Subprocess/vfork-follow-parent-wp.test
lldb/test/Shell/Subprocess/vfork-follow-parent.test
Removed:
################################################################################
diff --git a/lldb/test/Shell/Subprocess/Inputs/fork.cpp b/lldb/test/Shell/Subprocess/Inputs/fork.cpp
index 44242934bd3e..f4cf1c2c42dc 100644
--- a/lldb/test/Shell/Subprocess/Inputs/fork.cpp
+++ b/lldb/test/Shell/Subprocess/Inputs/fork.cpp
@@ -5,6 +5,7 @@
#include <sched.h>
#endif
#include <stdint.h>
+#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
@@ -15,28 +16,87 @@ void parent_func() {
printf("function run in parent\n");
}
-int child_func(void *unused) {
+int parent_done[2];
+char parent_done_str[16];
+
+void wait_for_parent() {
+ char buf[2];
+ // wait for the parent to finish its part
+ int ret = read(parent_done[0], buf, sizeof(buf));
+ assert(ret == 2);
+ ret = close(parent_done[0]);
+ assert(ret == 0);
+}
+
+int child_func(void *argv0_ptr) {
+ const char *argv0 = static_cast<char*>(argv0_ptr);
+
+ // NB: when using vfork(), the parent may be suspended while running
+ // this function, so do not rely on any synchronization until we exec
+#if defined(TEST_FORK)
+ if (TEST_FORK != vfork)
+#endif
+ wait_for_parent();
+
+ int ret = close(parent_done[1]);
+ assert(ret == 0);
+
// we need to avoid memory modifications for vfork(), yet we want
// to be able to test watchpoints, so do the next best thing
// and restore the original value
g_val = 2;
g_val = 0;
- return 0;
+ execl(argv0, argv0, parent_done_str, NULL);
+ assert(0 && "this should not be reached");
+ return 1;
}
-int main() {
+int main(int argc, char* argv[]) {
alignas(uintmax_t) char stack[4096];
+ int ret;
+
+ if (argv[1]) {
+ parent_done[0] = atoi(argv[1]);
+ assert(parent_done[0] != 0);
+
+#if defined(TEST_FORK)
+ // for vfork(), we need to synchronize after exec
+ if (TEST_FORK == vfork)
+ wait_for_parent();
+#endif
+
+ fprintf(stderr, "function run in exec'd child\n");
+ return 0;
+ }
+
+ ret = pipe(parent_done);
+ assert(ret == 0);
+
+ ret = snprintf(parent_done_str, sizeof(parent_done_str),
+ "%d", parent_done[0]);
+ assert(ret != -1);
#if defined(TEST_CLONE)
- pid_t pid = clone(child_func, &stack[sizeof(stack)], 0, NULL);
+ pid_t pid = clone(child_func, &stack[sizeof(stack)], 0, argv[0]);
#elif defined(TEST_FORK)
pid_t pid = TEST_FORK();
+ // NB: this must be equivalent to the clone() call above
if (pid == 0)
- _exit(child_func(NULL));
+ _exit(child_func(argv[0]));
#endif
assert(pid != -1);
+ ret = close(parent_done[0]);
+ assert(ret == 0);
+
parent_func();
+
+ // resume the child
+ ret = write(parent_done[1], "go", 2);
+ assert(ret == 2);
+ ret = close(parent_done[1]);
+ assert(ret == 0);
+
int status, wait_flags = 0;
#if defined(TEST_CLONE)
wait_flags = __WALL;
@@ -44,7 +104,7 @@ int main() {
pid_t waited = waitpid(pid, &status, wait_flags);
assert(waited == pid);
assert(WIFEXITED(status));
- printf("child exited: %d\n", WEXITSTATUS(status));
+ assert(WEXITSTATUS(status) == 0);
return 0;
}
diff --git a/lldb/test/Shell/Subprocess/clone-follow-child-softbp.test b/lldb/test/Shell/Subprocess/clone-follow-child-softbp.test
index f4fe8588ca32..f67b5a95e9cf 100644
--- a/lldb/test/Shell/Subprocess/clone-follow-child-softbp.test
+++ b/lldb/test/Shell/Subprocess/clone-follow-child-softbp.test
@@ -4,10 +4,12 @@
# RUN: %clangxx_host %p/Inputs/fork.cpp -DTEST_CLONE -o %t
# RUN: %lldb -b -s %s %t | FileCheck %s
settings set target.process.follow-fork-mode child
+settings set target.process.stop-on-exec false
b child_func
b parent_func
process launch
+# CHECK: function run in parent
# CHECK: stop reason = breakpoint
# CHECK-NEXT: child_func
continue
-# CHECK: child exited: 0
+# CHECK: function run in exec'd child
diff --git a/lldb/test/Shell/Subprocess/clone-follow-child-wp.test b/lldb/test/Shell/Subprocess/clone-follow-child-wp.test
index b56cc35f2e94..325316867f1a 100644
--- a/lldb/test/Shell/Subprocess/clone-follow-child-wp.test
+++ b/lldb/test/Shell/Subprocess/clone-follow-child-wp.test
@@ -4,12 +4,14 @@
# RUN: %clangxx_host -g %p/Inputs/fork.cpp -DTEST_CLONE -o %t
# RUN: %lldb -b -s %s %t | FileCheck %s
settings set target.process.follow-fork-mode child
+settings set target.process.stop-on-exec false
process launch -s
watchpoint set variable -w write g_val
# CHECK: Watchpoint created:
continue
+# CHECK: function run in parent
# CHECK: stop reason = watchpoint
continue
# CHECK: stop reason = watchpoint
continue
-# CHECK: child exited: 0
+# CHECK: function run in exec'd child
diff --git a/lldb/test/Shell/Subprocess/clone-follow-child.test b/lldb/test/Shell/Subprocess/clone-follow-child.test
index 0e00e41d3a13..0d17b81e697f 100644
--- a/lldb/test/Shell/Subprocess/clone-follow-child.test
+++ b/lldb/test/Shell/Subprocess/clone-follow-child.test
@@ -4,7 +4,8 @@
# RUN: %clangxx_host %p/Inputs/fork.cpp -DTEST_CLONE -o %t
# RUN: %lldb -b -s %s %t | FileCheck %s
settings set target.process.follow-fork-mode child
+settings set target.process.stop-on-exec false
b parent_func
process launch
# CHECK: function run in parent
-# CHECK: child exited: 0
+# CHECK: function run in exec'd child
diff --git a/lldb/test/Shell/Subprocess/clone-follow-parent-softbp.test b/lldb/test/Shell/Subprocess/clone-follow-parent-softbp.test
index 852ed9dcbce2..ddbe231d1d5e 100644
--- a/lldb/test/Shell/Subprocess/clone-follow-parent-softbp.test
+++ b/lldb/test/Shell/Subprocess/clone-follow-parent-softbp.test
@@ -10,4 +10,4 @@ process launch
# CHECK: stop reason = breakpoint
continue
# CHECK: function run in parent
-# CHECK: child exited: 0
+# CHECK: function run in exec'd child
diff --git a/lldb/test/Shell/Subprocess/clone-follow-parent-wp.test b/lldb/test/Shell/Subprocess/clone-follow-parent-wp.test
index 67d94af3ca10..e9ddd807f0f6 100644
--- a/lldb/test/Shell/Subprocess/clone-follow-parent-wp.test
+++ b/lldb/test/Shell/Subprocess/clone-follow-parent-wp.test
@@ -11,4 +11,4 @@ continue
# CHECK: stop reason = watchpoint
continue
# CHECK: function run in parent
-# CHECK: child exited: 0
+# CHECK: function run in exec'd child
diff --git a/lldb/test/Shell/Subprocess/clone-follow-parent.test b/lldb/test/Shell/Subprocess/clone-follow-parent.test
index 3d89279bbb29..2ea3a9cc749d 100644
--- a/lldb/test/Shell/Subprocess/clone-follow-parent.test
+++ b/lldb/test/Shell/Subprocess/clone-follow-parent.test
@@ -9,4 +9,4 @@ process launch
# CHECK: stop reason = breakpoint
continue
# CHECK: function run in parent
-# CHECK: child exited: 0
+# CHECK: function run in exec'd child
diff --git a/lldb/test/Shell/Subprocess/fork-follow-child-softbp.test b/lldb/test/Shell/Subprocess/fork-follow-child-softbp.test
index 68914a53a05e..7129d7b682c5 100644
--- a/lldb/test/Shell/Subprocess/fork-follow-child-softbp.test
+++ b/lldb/test/Shell/Subprocess/fork-follow-child-softbp.test
@@ -4,10 +4,12 @@
# RUN: %clangxx_host %p/Inputs/fork.cpp -DTEST_FORK=fork -o %t
# RUN: %lldb -b -s %s %t | FileCheck %s
settings set target.process.follow-fork-mode child
+settings set target.process.stop-on-exec false
b child_func
b parent_func
process launch
+# CHECK: function run in parent
# CHECK: stop reason = breakpoint
# CHECK-NEXT: child_func
continue
-# CHECK: child exited: 0
+# CHECK: function run in exec'd child
diff --git a/lldb/test/Shell/Subprocess/fork-follow-child-wp.test b/lldb/test/Shell/Subprocess/fork-follow-child-wp.test
index 437565788eeb..f0de4a4deb50 100644
--- a/lldb/test/Shell/Subprocess/fork-follow-child-wp.test
+++ b/lldb/test/Shell/Subprocess/fork-follow-child-wp.test
@@ -4,12 +4,14 @@
# RUN: %clangxx_host -g %p/Inputs/fork.cpp -DTEST_FORK=fork -o %t
# RUN: %lldb -b -s %s %t | FileCheck %s
settings set target.process.follow-fork-mode child
+settings set target.process.stop-on-exec false
process launch -s
watchpoint set variable -w write g_val
# CHECK: Watchpoint created:
continue
+# CHECK: function run in parent
# CHECK: stop reason = watchpoint
continue
# CHECK: stop reason = watchpoint
continue
-# CHECK: child exited: 0
+# CHECK: function run in exec'd child
diff --git a/lldb/test/Shell/Subprocess/fork-follow-child.test b/lldb/test/Shell/Subprocess/fork-follow-child.test
index 984caff6d345..c401e1528881 100644
--- a/lldb/test/Shell/Subprocess/fork-follow-child.test
+++ b/lldb/test/Shell/Subprocess/fork-follow-child.test
@@ -4,7 +4,8 @@
# RUN: %clangxx_host %p/Inputs/fork.cpp -DTEST_FORK=fork -o %t
# RUN: %lldb -b -s %s %t | FileCheck %s
settings set target.process.follow-fork-mode child
+settings set target.process.stop-on-exec false
b parent_func
process launch
# CHECK: function run in parent
-# CHECK: child exited: 0
+# CHECK: function run in exec'd child
diff --git a/lldb/test/Shell/Subprocess/fork-follow-parent-softbp.test b/lldb/test/Shell/Subprocess/fork-follow-parent-softbp.test
index 4dfcb52a61fc..4547e3c70d94 100644
--- a/lldb/test/Shell/Subprocess/fork-follow-parent-softbp.test
+++ b/lldb/test/Shell/Subprocess/fork-follow-parent-softbp.test
@@ -11,4 +11,4 @@ process launch
# CHECK-NEXT: parent_func
continue
# CHECK: function run in parent
-# CHECK: child exited: 0
+# CHECK: function run in exec'd child
diff --git a/lldb/test/Shell/Subprocess/fork-follow-parent-wp.test b/lldb/test/Shell/Subprocess/fork-follow-parent-wp.test
index cde5b41f228b..e70715a71a4d 100644
--- a/lldb/test/Shell/Subprocess/fork-follow-parent-wp.test
+++ b/lldb/test/Shell/Subprocess/fork-follow-parent-wp.test
@@ -10,4 +10,4 @@ continue
# CHECK: stop reason = watchpoint
continue
# CHECK: function run in parent
-# CHECK: child exited: 0
+# CHECK: function run in exec'd child
diff --git a/lldb/test/Shell/Subprocess/fork-follow-parent.test b/lldb/test/Shell/Subprocess/fork-follow-parent.test
index 1ffc2cbc1f99..2bab50d9c84b 100644
--- a/lldb/test/Shell/Subprocess/fork-follow-parent.test
+++ b/lldb/test/Shell/Subprocess/fork-follow-parent.test
@@ -8,4 +8,4 @@ process launch
# CHECK: stop reason = breakpoint
continue
# CHECK: function run in parent
-# CHECK: child exited: 0
+# CHECK: function run in exec'd child
diff --git a/lldb/test/Shell/Subprocess/vfork-follow-child-softbp.test b/lldb/test/Shell/Subprocess/vfork-follow-child-softbp.test
index e9cda8bd58f1..c82a4f6cdc74 100644
--- a/lldb/test/Shell/Subprocess/vfork-follow-child-softbp.test
+++ b/lldb/test/Shell/Subprocess/vfork-follow-child-softbp.test
@@ -1,13 +1,12 @@
# REQUIRES: native
# UNSUPPORTED: system-darwin
# UNSUPPORTED: system-windows
-# This test is very flaky on aarch64.
-# UNSUPPORTED: system-linux && target-aarch64
# RUN: %clangxx_host %p/Inputs/fork.cpp -DTEST_FORK=vfork -o %t
# RUN: %lldb -b -s %s %t | FileCheck %s
settings set target.process.follow-fork-mode child
+settings set target.process.stop-on-exec false
b child_func
b parent_func
process launch
# CHECK: function run in parent
-# CHECK: child exited: 0
+# CHECK: function run in exec'd child
diff --git a/lldb/test/Shell/Subprocess/vfork-follow-child-wp.test b/lldb/test/Shell/Subprocess/vfork-follow-child-wp.test
index 66cfa439f534..2de3229bfcad 100644
--- a/lldb/test/Shell/Subprocess/vfork-follow-child-wp.test
+++ b/lldb/test/Shell/Subprocess/vfork-follow-child-wp.test
@@ -1,13 +1,13 @@
# REQUIRES: native && dbregs-set
# UNSUPPORTED: system-darwin
# UNSUPPORTED: system-windows
-# This test is very flaky on aarch64.
-# UNSUPPORTED: system-linux && target-aarch64
# RUN: %clangxx_host -g %p/Inputs/fork.cpp -DTEST_FORK=vfork -o %t
# RUN: %lldb -b -s %s %t | FileCheck %s
settings set target.process.follow-fork-mode child
+settings set target.process.stop-on-exec false
process launch -s
watchpoint set variable -w write g_val
# CHECK: Watchpoint created:
continue
-# CHECK: child exited: 0
+# CHECK: function run in parent
+# CHECK: function run in exec'd child
diff --git a/lldb/test/Shell/Subprocess/vfork-follow-child.test b/lldb/test/Shell/Subprocess/vfork-follow-child.test
index 57a054a15b28..833fbb8837af 100644
--- a/lldb/test/Shell/Subprocess/vfork-follow-child.test
+++ b/lldb/test/Shell/Subprocess/vfork-follow-child.test
@@ -1,12 +1,11 @@
# REQUIRES: native
# UNSUPPORTED: system-darwin
# UNSUPPORTED: system-windows
-# This test is very flaky on aarch64.
-# UNSUPPORTED: system-linux && target-aarch64
# RUN: %clangxx_host %p/Inputs/fork.cpp -DTEST_FORK=vfork -o %t
# RUN: %lldb -b -s %s %t | FileCheck %s
settings set target.process.follow-fork-mode child
+settings set target.process.stop-on-exec false
b parent_func
process launch
# CHECK: function run in parent
-# CHECK: child exited: 0
+# CHECK: function run in exec'd child
diff --git a/lldb/test/Shell/Subprocess/vfork-follow-parent-softbp.test b/lldb/test/Shell/Subprocess/vfork-follow-parent-softbp.test
index f158d1a9c904..9d19b385cad8 100644
--- a/lldb/test/Shell/Subprocess/vfork-follow-parent-softbp.test
+++ b/lldb/test/Shell/Subprocess/vfork-follow-parent-softbp.test
@@ -10,4 +10,4 @@ process launch
# CHECK: stop reason = breakpoint
continue
# CHECK: function run in parent
-# CHECK: child exited: 0
+# CHECK: function run in exec'd child
diff --git a/lldb/test/Shell/Subprocess/vfork-follow-parent-wp.test b/lldb/test/Shell/Subprocess/vfork-follow-parent-wp.test
index 8c74e28dbc19..28c0e6620b04 100644
--- a/lldb/test/Shell/Subprocess/vfork-follow-parent-wp.test
+++ b/lldb/test/Shell/Subprocess/vfork-follow-parent-wp.test
@@ -11,4 +11,4 @@ continue
# CHECK: stop reason = watchpoint
continue
# CHECK: function run in parent
-# CHECK: child exited: 0
+# CHECK: function run in exec'd child
diff --git a/lldb/test/Shell/Subprocess/vfork-follow-parent.test b/lldb/test/Shell/Subprocess/vfork-follow-parent.test
index 6d9850a706e6..c2777a3564c4 100644
--- a/lldb/test/Shell/Subprocess/vfork-follow-parent.test
+++ b/lldb/test/Shell/Subprocess/vfork-follow-parent.test
@@ -8,4 +8,4 @@ process launch
# CHECK: stop reason = breakpoint
continue
# CHECK: function run in parent
-# CHECK: child exited: 0
+# CHECK: function run in exec'd child
More information about the lldb-commits
mailing list