[pushed] [gdb/testsuite] Fix gdb.threads/watchpoint-fork.exp race

Sourceware to Gerrit sync (Code Review) gerrit@gnutoolchain-gerrit.osci.io
Wed Jan 29 07:50:00 GMT 2020


Sourceware to Gerrit sync has submitted this change.

Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/446
......................................................................

[gdb/testsuite] Fix gdb.threads/watchpoint-fork.exp race

I ran into:
...
Thread 3.1 "watchpoint-fork" hit Breakpoint 3, marker () at \
  watchpoint-fork-mt.c:42^M
42      }^M
(gdb) parent2: 1945^M

FAIL: gdb.threads/watchpoint-fork.exp: child: multithreaded: breakpoint (A) \
  after the second fork (timeout)
...
The problem is that the FAILing gdb_test expects '(gdb) ' to be the last thing
printed, but the inferior prints something after that.

A similar FAIL is described in the sources in watchpoint-fork-parent.c:
...
      printf ("child%d: %d\n", nr, (int) getpid ());
      /* Delay to get both the "child%d" and "parent%d" message printed
      	 without a race breaking expect by its endless wait on `$gdb_prompt$':
         Breakpoint 3, marker () at watchpoint-fork.c:33
         33      }
         (gdb) parent2: 14223  */
      i = sleep (1);
...

I noticed that while the executables print output, the output is not verified in
the test-case, so it's merely debug output.

Fix this by:
- guarding the prints in the executables (as well as related
  sleep and setbuf calls) with #if DEBUG, and
- compiling by default with DEBUG=0.

gdb/testsuite/ChangeLog:

2020-01-29  Tom de Vries  <tdevries@suse.de>

	* gdb.threads/watchpoint-fork-child.c: Guard prints with #if DEBUG.
	* gdb.threads/watchpoint-fork-mt.c: Same.
	* gdb.threads/watchpoint-fork-parent.c: Same.
	* gdb.threads/watchpoint-fork-st.c: Same.
	* gdb.threads/watchpoint-fork.exp: Compile with DEBUG=0.

Change-Id: I63efd4c7771f96b5f5cd87ef2ab36795484ae2be
---
M gdb/testsuite/ChangeLog
M gdb/testsuite/gdb.threads/watchpoint-fork-child.c
M gdb/testsuite/gdb.threads/watchpoint-fork-mt.c
M gdb/testsuite/gdb.threads/watchpoint-fork-parent.c
M gdb/testsuite/gdb.threads/watchpoint-fork-st.c
M gdb/testsuite/gdb.threads/watchpoint-fork.exp
6 files changed, 31 insertions(+), 2 deletions(-)


diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 4fd5dc8..6559b7d 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2020-01-29  Tom de Vries  <tdevries@suse.de>
+
+	* gdb.threads/watchpoint-fork-child.c: Guard prints with #if DEBUG.
+	* gdb.threads/watchpoint-fork-mt.c: Same.
+	* gdb.threads/watchpoint-fork-parent.c: Same.
+	* gdb.threads/watchpoint-fork-st.c: Same.
+	* gdb.threads/watchpoint-fork.exp: Compile with DEBUG=0.
+
 2020-01-27  Luis Machado  <luis.machado@linaro.org>
 
 	* gdb.base/step-over-syscall.exp (setup): Check if we're already
diff --git a/gdb/testsuite/gdb.threads/watchpoint-fork-child.c b/gdb/testsuite/gdb.threads/watchpoint-fork-child.c
index 1da75c9..96860bb 100644
--- a/gdb/testsuite/gdb.threads/watchpoint-fork-child.c
+++ b/gdb/testsuite/gdb.threads/watchpoint-fork-child.c
@@ -59,7 +59,9 @@
     case -1:
       assert (0);
     default:
+#if DEBUG
       printf ("parent%d: %d\n", nr, (int) child);
+#endif
 
       /* Sleep for a while to possibly get incorrectly ATTACH_THREADed by GDB
 	 tracing the child fork with no longer valid thread/lwp entries of the
@@ -95,7 +97,9 @@
 
       _exit (0);
     case 0:
+#if DEBUG
       printf ("child%d: %d\n", nr, (int) getpid ());
+#endif
 
       /* Let the parent signal us about its success.  Be careful of races.  */
 
diff --git a/gdb/testsuite/gdb.threads/watchpoint-fork-mt.c b/gdb/testsuite/gdb.threads/watchpoint-fork-mt.c
index 4b195f97..7b1bbf4 100644
--- a/gdb/testsuite/gdb.threads/watchpoint-fork-mt.c
+++ b/gdb/testsuite/gdb.threads/watchpoint-fork-mt.c
@@ -114,8 +114,10 @@
   int i;
   void *thread_result;
 
+#if DEBUG
   setbuf (stdout, NULL);
   printf ("main: %d\n", (int) gettid ());
+#endif
 
   /* General hardware breakpoints and watchpoints validity.  */
   marker ();
diff --git a/gdb/testsuite/gdb.threads/watchpoint-fork-parent.c b/gdb/testsuite/gdb.threads/watchpoint-fork-parent.c
index 511c951..2b325b0 100644
--- a/gdb/testsuite/gdb.threads/watchpoint-fork-parent.c
+++ b/gdb/testsuite/gdb.threads/watchpoint-fork-parent.c
@@ -40,6 +40,7 @@
     case -1:
       assert (0);
     case 0:
+#if DEBUG
       printf ("child%d: %d\n", nr, (int) getpid ());
       /* Delay to get both the "child%d" and "parent%d" message printed without
 	 a race breaking expect by its endless wait on `$gdb_prompt$':
@@ -48,6 +49,7 @@
 	 (gdb) parent2: 14223  */
       i = sleep (1);
       assert (i == 0);
+#endif
 
       /* We must not get caught here (against a forgotten breakpoint).  */
       var++;
@@ -55,11 +57,13 @@
 
       _exit (exit_code);
     default:
+#if DEBUG
       printf ("parent%d: %d\n", nr, (int) child);
       /* Delay to get both the "child%d" and "parent%d" message printed, see
 	 above.  */
       i = sleep (1);
       assert (i == 0);
+#endif
 
       pid_got = wait (&status);
       assert (pid_got == child);
diff --git a/gdb/testsuite/gdb.threads/watchpoint-fork-st.c b/gdb/testsuite/gdb.threads/watchpoint-fork-st.c
index b75deb6..8a7caec 100644
--- a/gdb/testsuite/gdb.threads/watchpoint-fork-st.c
+++ b/gdb/testsuite/gdb.threads/watchpoint-fork-st.c
@@ -40,8 +40,10 @@
 int
 main (void)
 {
+#if DEBUG
   setbuf (stdout, NULL);
   printf ("main: %d\n", (int) getpid ());
+#endif
 
   /* General hardware breakpoints and watchpoints validity.  */
   marker ();
diff --git a/gdb/testsuite/gdb.threads/watchpoint-fork.exp b/gdb/testsuite/gdb.threads/watchpoint-fork.exp
index 5f38fca..6500c0d 100644
--- a/gdb/testsuite/gdb.threads/watchpoint-fork.exp
+++ b/gdb/testsuite/gdb.threads/watchpoint-fork.exp
@@ -17,7 +17,11 @@
 
 set testfile watchpoint-fork
 
+# Set DEBUG to 0 or 1 in sources
+set debug 0
+
 proc test {type symbol} {
+    global debug
     with_test_prefix "$type" {
 	global testfile subdir srcdir gdb_prompt
 
@@ -30,7 +34,8 @@
 	    set srcfile_main ${testfile}-st.c
 	    if {[build_executable $testfile.exp $executable \
 		     [list $srcfile_main ${testfile}-${type}.c] \
-		     [list debug additional_flags=-D$symbol]] == -1} {
+		     [list debug additional_flags=-D$symbol \
+			  additional_flags=-DDEBUG=$debug]] == -1} {
 		return -1
 	    }
 
@@ -96,7 +101,11 @@
 	with_test_prefix "multithreaded" {
 	    set executable ${testfile}-${type}-mt
 	    set srcfile_main ${srcdir}/${subdir}/${testfile}-mt.c
-	    if { [gdb_compile_pthreads "${srcfile_main} ${srcfile_type}" [standard_output_file ${executable}] executable [list debug "additional_flags=-D$symbol -DTHREAD"]] != "" } {
+	    if { [gdb_compile_pthreads "${srcfile_main} ${srcfile_type}" \
+		      [standard_output_file ${executable}] executable \
+		      [list debug "additional_flags=-D$symbol" \
+			   "additional_flags=-DDEBUG=$debug" \
+			   "-DTHREAD"]] != "" } {
 		untested "failed to compile"
 		return
 	    }

-- 
Gerrit-Project: binutils-gdb
Gerrit-Branch: master
Gerrit-Change-Id: I63efd4c7771f96b5f5cd87ef2ab36795484ae2be
Gerrit-Change-Number: 446
Gerrit-PatchSet: 2
Gerrit-Owner: Tom de Vries <tdevries@suse.de>
Gerrit-Reviewer: Luis Machado <luis.machado@linaro.org>
Gerrit-Reviewer: Simon Marchi <simon.marchi@polymtl.ca>
Gerrit-Reviewer: Tom de Vries <tdevries@suse.de>
Gerrit-MessageType: merged



More information about the Gdb-patches mailing list