From e3e837844a32374a5d787a11ed5e54a856d4d4b0 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Fri, 18 Jun 2021 13:50:45 +0100 Subject: [PATCH] gdb.perf/: FAIL on Python errors, avoid "ERROR: internal buffer is full" 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 "", line 1, in File "/home/pedro/rocm/gdb/src/gdb/testsuite/gdb.perf/lib/perftest/perftest.py", line 65, in run self.execute_test() File "", 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 * 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 | 2 +- gdb/testsuite/gdb.perf/disassemble.exp | 2 +- gdb/testsuite/gdb.perf/single-step.exp | 2 +- gdb/testsuite/gdb.perf/skip-command.exp | 2 +- gdb/testsuite/gdb.perf/skip-prologue.exp | 12 +-------- gdb/testsuite/gdb.perf/solib.exp | 2 +- .../gdb.perf/template-breakpoints.exp | 2 +- gdb/testsuite/lib/perftest.exp | 25 +++++++++++++++++++ 8 files changed, 32 insertions(+), 17 deletions(-) diff --git a/gdb/testsuite/gdb.perf/backtrace.exp b/gdb/testsuite/gdb.perf/backtrace.exp index 1e1243c8900..ced653c4b84 100644 --- a/gdb/testsuite/gdb.perf/backtrace.exp +++ b/gdb/testsuite/gdb.perf/backtrace.exp @@ -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 } diff --git a/gdb/testsuite/gdb.perf/disassemble.exp b/gdb/testsuite/gdb.perf/disassemble.exp index 55261d0d6bf..4a79e298e02 100644 --- a/gdb/testsuite/gdb.perf/disassemble.exp +++ b/gdb/testsuite/gdb.perf/disassemble.exp @@ -55,6 +55,6 @@ PerfTest::assemble { return 0 } { - gdb_test "python Disassemble\(\).run()" + gdb_test_python_run "Disassemble\(\)" return 0 } diff --git a/gdb/testsuite/gdb.perf/single-step.exp b/gdb/testsuite/gdb.perf/single-step.exp index 4a8eafe5bb5..7a5d068f153 100644 --- a/gdb/testsuite/gdb.perf/single-step.exp +++ b/gdb/testsuite/gdb.perf/single-step.exp @@ -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 diff --git a/gdb/testsuite/gdb.perf/skip-command.exp b/gdb/testsuite/gdb.perf/skip-command.exp index dfd84a15820..e396262af06 100644 --- a/gdb/testsuite/gdb.perf/skip-command.exp +++ b/gdb/testsuite/gdb.perf/skip-command.exp @@ -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" diff --git a/gdb/testsuite/gdb.perf/skip-prologue.exp b/gdb/testsuite/gdb.perf/skip-prologue.exp index 8ff9238b280..7caff667a0d 100644 --- a/gdb/testsuite/gdb.perf/skip-prologue.exp +++ b/gdb/testsuite/gdb.perf/skip-prologue.exp @@ -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 } diff --git a/gdb/testsuite/gdb.perf/solib.exp b/gdb/testsuite/gdb.perf/solib.exp index 61e9a95841d..e0cd341bf31 100644 --- a/gdb/testsuite/gdb.perf/solib.exp +++ b/gdb/testsuite/gdb.perf/solib.exp @@ -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 } diff --git a/gdb/testsuite/gdb.perf/template-breakpoints.exp b/gdb/testsuite/gdb.perf/template-breakpoints.exp index aa4dc950984..96c1209e96c 100644 --- a/gdb/testsuite/gdb.perf/template-breakpoints.exp +++ b/gdb/testsuite/gdb.perf/template-breakpoints.exp @@ -59,7 +59,7 @@ PerfTest::assemble { return 0 } { - gdb_test "python TemplateBreakpoints().run()" + gdb_test_python_run "TemplateBreakpoints()" return 0 } diff --git a/gdb/testsuite/lib/perftest.exp b/gdb/testsuite/lib/perftest.exp index 5549a723a0c..de995188090 100644 --- a/gdb/testsuite/lib/perftest.exp +++ b/gdb/testsuite/lib/perftest.exp @@ -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 + } + } +} -- 2.30.2