gdb.perf/: FAIL on Python errors, avoid "ERROR: internal buffer is full"
authorPedro Alves <pedro@palves.net>
Fri, 18 Jun 2021 12:50:45 +0000 (13:50 +0100)
committerPedro Alves <pedro@palves.net>
Tue, 6 Jul 2021 10:51:57 +0000 (11:51 +0100)
Currently, if you run make check-perf on a system with Python 3.8,
tests seen to PASS, but they actually test a lot less than intended,
due to:

 PerfTest::assemble, run ...
 python BackTrace(64).run()
 Traceback (most recent call last):
   File "<string>", line 1, in <module>
   File "/home/pedro/rocm/gdb/src/gdb/testsuite/gdb.perf/lib/perftest/perftest.py", line 65, in run
     self.execute_test()
   File "<string>", line 49, in execute_test
   File "/home/pedro/rocm/gdb/src/gdb/testsuite/gdb.perf/lib/perftest/measure.py", line 45, in measure
     m.start(id)
   File "/home/pedro/rocm/gdb/src/gdb/testsuite/gdb.perf/lib/perftest/measure.py", line 102, in start
     self.start_time = time.clock()
 AttributeError: module 'time' has no attribute 'clock'
 Error while executing Python code.
 (gdb) PASS: gdb.perf/backtrace.exp: python BackTrace(64).run()

And then, after fixing the above Python compatibility issues (which
will be a separate patch), I get 86 instances of overflowing expect's
buffer, like:

  ERROR: internal buffer is full.
  UNRESOLVED: gdb.perf/single-step.exp: python SingleStep(1000).run()

This patch fixes both problems by adding & using a gdb_test_python_run
routine that:

 - checks for Python errors
 - consumes output line by line

gdb/testsuite/ChangeLog:
yyyy-mm-dd  Pedro Alves  <pedro@palves.net>

* gdb.perf/backtrace.exp: Use gdb_test_python_run.
* gdb.perf/disassemble.exp: Use gdb_test_python_run.
* gdb.perf/single-step.exp: Use gdb_test_python_run.
* gdb.perf/skip-command.exp: Use gdb_test_python_run.
* gdb.perf/skip-prologue.exp: Use gdb_test_python_run.
* gdb.perf/solib.exp: Use gdb_test_python_run.
* gdb.perf/template-breakpoints.exp: Use gdb_test_python_run.
* lib/perftest.exp (gdb_test_python_run): New.

Change-Id: I007af36f164b3f4cda41033616eaaa4e268dfd2f

gdb/testsuite/gdb.perf/backtrace.exp
gdb/testsuite/gdb.perf/disassemble.exp
gdb/testsuite/gdb.perf/single-step.exp
gdb/testsuite/gdb.perf/skip-command.exp
gdb/testsuite/gdb.perf/skip-prologue.exp
gdb/testsuite/gdb.perf/solib.exp
gdb/testsuite/gdb.perf/template-breakpoints.exp
gdb/testsuite/lib/perftest.exp

index 1e1243c89007d22219285cc3e27fb7c33caab47f..ced653c4b8499218c0a47f543ad663bd7320884f 100644 (file)
@@ -63,7 +63,7 @@ PerfTest::assemble {
 } {
     global BACKTRACE_DEPTH
 
-    gdb_test "python BackTrace\($BACKTRACE_DEPTH\).run()"
+    gdb_test_python_run "BackTrace\($BACKTRACE_DEPTH\)"
 
     return 0
 }
index 55261d0d6bfc71c7e4b0c96b1f1ad62f5ae933f2..4a79e298e02e1b332ee062e1f6551df8feb3b4ed 100644 (file)
@@ -55,6 +55,6 @@ PerfTest::assemble {
 
     return 0
 } {
-    gdb_test "python Disassemble\(\).run()"
+    gdb_test_python_run "Disassemble\(\)"
     return 0
 }
index 4a8eafe5bb56aec796e9b5a49be9180f9316b6e1..7a5d068f153d8de0fe44d9f8e72aa5a10b02648a 100644 (file)
@@ -51,7 +51,7 @@ PerfTest::assemble {
 } {
     global SINGLE_STEP_COUNT
 
-    gdb_test_no_output "python SingleStep\(${SINGLE_STEP_COUNT}\).run()"
+    gdb_test_python_run "SingleStep\(${SINGLE_STEP_COUNT}\)"
     # Terminate the loop.
     gdb_test "set variable flag = 0"
     return 0
index dfd84a158208c736921f7bc384e3a73f72921f87..e396262af0657826518af0adb07a2d79e4a57e5e 100644 (file)
@@ -103,7 +103,7 @@ proc run_skip_bench { kind text } {
     for { set i 0 } { $i < 5 } { incr i } {
        set nr_skips [expr $i * $SKIP_DIRECTIVE_COUNT]
        install_skips $kind $text $nr_skips
-       gdb_test_no_output "python SkipCommand\(\"skip-$kind-$nr_skips\", ${SKIP_STEP_COUNT}\).run()"
+       gdb_test_python_run "SkipCommand\(\"skip-$kind-$nr_skips\", ${SKIP_STEP_COUNT}\)"
     }
 
     gdb_test "set variable flag = 0"
index 8ff9238b28029380e6a25f48b810fd4a0b8f61b7..7caff667a0d02dab312099717aef29c174d5c560 100644 (file)
@@ -63,16 +63,6 @@ PerfTest::assemble {
 } {
     global SKIP_PROLOGUE_COUNT
 
-    set test "run"
-    gdb_test_multiple "python SkipPrologue\($SKIP_PROLOGUE_COUNT\).run()" $test {
-       -re "Breakpoint $decimal at \[^\n\]*\n" {
-           # GDB prints some messages on breakpoint creation.
-           # Consume the output to avoid internal buffer full.
-           exp_continue
-       }
-       -re ".*$gdb_prompt $" {
-           pass $test
-       }
-    }
+    gdb_test_python_run "SkipPrologue\($SKIP_PROLOGUE_COUNT\)" "run"
     return 0
 }
index 61e9a95841db5e8de495ac2b754710850322a581..e0cd341bf31a8caaff0536e0ee094cae3ea93674 100644 (file)
@@ -84,6 +84,6 @@ PerfTest::assemble {
 } {
     global SOLIB_COUNT
 
-    gdb_test_no_output "python SolibLoadUnload\($SOLIB_COUNT\).run()"
+    gdb_test_python_run "SolibLoadUnload\($SOLIB_COUNT\)"
     return 0
 }
index aa4dc950984ac1ea638d65e1b56ced14c4acce7d..96c1209e96c42e4272dd7427e14fbefefbcc202b 100644 (file)
@@ -59,7 +59,7 @@ PerfTest::assemble {
        return 0
 } {
 
-       gdb_test "python TemplateBreakpoints().run()"
+       gdb_test_python_run "TemplateBreakpoints()"
 
        return 0
 }
index 5549a723a0cdcb64a8652c7d62ca9c64cc8eade6..de9951880900153196dcaaf555bcc2b5f63cd8e8 100644 (file)
@@ -155,3 +155,28 @@ proc tcl_string_list_to_python_list { l } {
     }
     return "([join $quoted_list {, }])"
 }
+
+# Helper routine for PerfTest::assemble "run" step implementations.
+# Issues the "python ${OBJ}.run()" command, and consumes GDB output
+# line by line.  Issues a FAIL if the command fails with a Python
+# error.  Issues a PASS on success.  MESSAGE is an optional message to
+# be printed.  If this is omitted, then the pass/fail messages use the
+# command string as the message.
+
+proc gdb_test_python_run {obj {message ""}} {
+    global gdb_prompt
+
+    set saw_error 0
+    gdb_test_multiple "python ${obj}.run()" $message {
+       -re "Error while executing Python code\\." {
+           set saw_error 1
+           exp_continue
+       }
+       -re "\[^\r\n\]*\r\n" {
+           exp_continue
+       }
+       -re "$gdb_prompt $" {
+           gdb_assert {!$saw_error} $gdb_test_name
+       }
+    }
+}