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 "<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
This commit is contained in:
Pedro Alves 2021-06-18 13:50:45 +01:00
parent 0d4e283965
commit e3e837844a
8 changed files with 32 additions and 17 deletions

View 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
}

View file

@ -55,6 +55,6 @@ PerfTest::assemble {
return 0
} {
gdb_test "python Disassemble\(\).run()"
gdb_test_python_run "Disassemble\(\)"
return 0
}

View 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

View 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"

View 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
}

View 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
}

View file

@ -59,7 +59,7 @@ PerfTest::assemble {
return 0
} {
gdb_test "python TemplateBreakpoints().run()"
gdb_test_python_run "TemplateBreakpoints()"
return 0
}

View 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
}
}
}