[PATCH] [testsuite] Fix timeout with maint print objfiles

Luis Machado luis.machado@linaro.org
Tue Apr 27 14:10:44 GMT 2021


I'm seeing timeouts from gdb.rust/traits.exp when we attempt to print
things with "maint print objfiles".

This happens for two reasons:

1 - GDB does not explicitly split each entry into its own line, but rather
    relies on the terminal's width to insert line breaks.

2 - When running the GDB testsuite, such width may be unlimited, which will
    prevent GDB from inserting any line breaks.

As a result, the output may be too lengthy and will come in big lines.  Tweak
the support library to match the patterns line-by-line, which gives us more
time to match things. Also fix GDB's output to print one entry per line,
regardless of the terminal width.

A similar approach was used in another testcase using the same command (commit
eaeaf44cfdc9a4096a0dd52fa0606f29d4bfd48e). With the new line breaks, we don't
need a particular pattern, so clean up that test as well.

gdb/ChangeLog:

YYYY-MM-DD  Luis Machado  <luis.machado@linaro.org>

	* psymtab.c (psymbol_functions::dump): Output newline.
	* symmisc.c (dump_objfile): Likewise.

gdb/testsuite/ChangeLog:

YYYY-MM-DD  Luis Machado  <luis.machado@linaro.org>

	* gdb.base/maint.exp: Drop a pattern that is not needed.
	* lib/gdb.exp (readnow): Match line-by-line.
---
 gdb/psymtab.c                    |  2 +-
 gdb/symmisc.c                    |  4 ++--
 gdb/testsuite/gdb.base/maint.exp |  3 ---
 gdb/testsuite/lib/gdb.exp        | 17 ++++++++++++-----
 4 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/gdb/psymtab.c b/gdb/psymtab.c
index 75a307c89aa..e3032d60343 100644
--- a/gdb/psymtab.c
+++ b/gdb/psymtab.c
@@ -885,7 +885,7 @@ psymbol_functions::dump (struct objfile *objfile)
 	  printf_filtered ("%s at ",
 			   psymtab->filename);
 	  gdb_print_host_address (psymtab, gdb_stdout);
-	  printf_filtered (", ");
+	  printf_filtered ("\n");
 	  wrap_here ("  ");
 	}
       printf_filtered ("\n\n");
diff --git a/gdb/symmisc.c b/gdb/symmisc.c
index d992c671635..d70c5ecda49 100644
--- a/gdb/symmisc.c
+++ b/gdb/symmisc.c
@@ -131,11 +131,11 @@ dump_objfile (struct objfile *objfile)
 	      printf_filtered ("%s at ",
 			       symtab_to_filename_for_display (symtab));
 	      gdb_print_host_address (symtab, gdb_stdout);
-	      printf_filtered (", ");
 	      if (SYMTAB_OBJFILE (symtab) != objfile)
 		{
-		  printf_filtered ("NOT ON CHAIN!  ");
+		  printf_filtered (", NOT ON CHAIN!");
 		}
+	      printf_filtered ("\n");
 	      wrap_here ("  ");
 	    }
 	}
diff --git a/gdb/testsuite/gdb.base/maint.exp b/gdb/testsuite/gdb.base/maint.exp
index e72392220cc..6831d1ba720 100644
--- a/gdb/testsuite/gdb.base/maint.exp
+++ b/gdb/testsuite/gdb.base/maint.exp
@@ -230,9 +230,6 @@ gdb_test_multiple "maint print objfiles" "" -lbl {
 	set symtabs 1
 	exp_continue
     }
-    -re " at $hex," {
-	exp_continue
-    }
     -re -wrap "" {
 	pass $gdb_test_name
     }
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index 943112fcc80..01012b9a5a3 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -7511,17 +7511,24 @@ proc readnow { args } {
     } else {
 	set re ""
     }
+
+    global gdb_prompt
+    set readnow_p 0
+    # Given the listing from the following command can be very verbose, match
+    # the patterns line-by-line.  This prevents timeouts from waiting for
+    # too much data to come at once.
     set cmd "maint print objfiles $re"
-    gdb_test_multiple $cmd "" {
-	-re -wrap "\r\n.gdb_index: faked for \"readnow\"\r\n.*" {
-	    return 1
+    gdb_test_multiple $cmd "" -lbl {
+	-re "\r\n.gdb_index: faked for \"readnow\"" {
+	    # Record the we've seen the above pattern.
+	    set readnow_p 1
 	}
 	-re -wrap "" {
-	    return 0
+	    # We don't care about any other input.
 	}
     }
 
-    return 0
+    return $readnow_p
 }
 
 # Return 1 if partial symbols are available.  Otherwise, return 0.
-- 
2.25.1



More information about the Gdb-patches mailing list