[patch] testsuite: Fix racy clashing for gdb.base{1,2}/ parallel run

Jan Kratochvil jan.kratochvil@redhat.com
Mon Jul 13 00:47:00 GMT 2009


Hi,

randomly some testcases fail now with paralell testsuite due to:

(gdb) file /.../gdb.base/int-type
Reading symbols from /.../gdb.base/int-type...done.
[...]
(gdb) break main
Cannot access memory at address 0x4004bc
(gdb) FAIL: gdb.base/logical.exp: setting breakpoint at main
ERROR: couldn't run to breakpoint

It is because some of the target binaries are reused across the .exp testcases
and they can run in parallel from gdb.base1 and gdb.base2 at once storing the
binaries both to gdb.base.

I did not find any names of binaries to be shared between different
subdirectory names.  And no other directory besides gdb.base is run in
parallel (specifically in two halves in the gdb.base case).

Found out these binaries names are shared across these two groups:
gdb.base1 ([a-m]*): break constvars int-type
gdb.base2 ([n-z]*): return2 run start watch_thread_num

Fixed just the minimal set of conflicting testcases the hard way [attached].
It means a similiar race may get introduced again by some future changees.

I tried some ways for a general framework fix to store the binaries into
separate directories for the gdb.base1 and gdb.base2 runs but I did not find
it much feasible.  The problems are:

${subdir} must be as-is gdb.base (not gdb.base1) as sources are at
${srcdir}/${subdir}/file.c.  There cannot be symlink gdb.base -> gdb.base1 in
${srcdir} as ${srcdir} must be readonly.

Therefore ${objdir} could be possibly gdb.base1 (not as-is .).  Then binaries
would be in gdb.base1/gdb.base (becauase they are in ${objdir}/${subdir}).
But the scripts expect now the current directory equals ${objdir} but wit this
change the current directory would be ${objdir}/../ .

Symlink `ln -s . gdb.base1/gdb.base' cannot be used as then the scripts expect
names like gdb.base1/gdb.base/file but GDB prints it as a resolved name
gdb.base1/file which does not patch the expect strings.

I did no longer try to go that way, just one last thought:
Some scripts have bugs so that their binary files are created in the current
directory (and not in ${subdir}).  Therefore if there would be a change so
that the current directory is always in ${objdir} (therefore in gdb.base1) it
may be better to globally change the current directory to be in
${objdir}/${subdir}.


Regression tested on {x86_64,x86_64-32,i686}-fedora11-linux-gnu.


Thanks,
Jan


gdb/testsuite/
2009-07-12  Jan Kratochvil  <jan.kratochvil@redhat.com>

	Fix racy clashing of output files for gdb.base{1,2}/ parallel run.
	* gdb.base/annota1.exp (thread_test): Import global $testfile.
	Change the compilation target to match the testcase name.
	* gdb.base/sect-cmd.exp: Change the compilation target to match the
	testcase name.
	* a2-run.exp: Use for setup prepare_for_testing.  Change the
	compilation target to match the testcase name.
	* gdb.base/commands.exp: Likewise.
	* gdb.base/finish.exp: Likewise.
	* gdb.base/float.exp: Likewise.
	* gdb.base/info-target.exp: Likewise.
	* gdb.base/relational.exp: Likewise.
	* gdb.base/term.exp: Likewise.
	* gdb.base/until.exp: Likewise.
	* gdb.base/volatile.exp: Likewise.
	* gdb.base/whatis-exp.exp: Likewise.

--- a/gdb/testsuite/gdb.base/a2-run.exp
+++ b/gdb/testsuite/gdb.base/a2-run.exp
@@ -31,19 +31,11 @@ if $tracelevel then {
 set prms_id 0
 set bug_id 0
 
-set testfile "run"
-set srcfile ${testfile}.c
-set binfile ${objdir}/${subdir}/${testfile}
-if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
-    untested a2-run.exp
+set testfile a2-run
+if { [prepare_for_testing ${testfile}.exp $testfile run.c] } {
     return -1
 }
 
-gdb_exit
-gdb_start
-gdb_reinitialize_dir $srcdir/$subdir
-gdb_load ${binfile}
-
 # Run with no arguments.
 # On VxWorks this justs make sure the program was run.
 gdb_run_cmd
--- a/gdb/testsuite/gdb.base/annota1.exp
+++ b/gdb/testsuite/gdb.base/annota1.exp
@@ -491,11 +491,10 @@ if [ regexp "core not found" $exec_output]  {
 }
 
 proc thread_test {} {
-    global objdir subdir srcdir
+    global objdir subdir srcdir testfile
     global gdb_prompt old_gdb_prompt
-    set testfile "watch_thread_num"
-    set srcfile ${testfile}.c
-    set binfile ${objdir}/${subdir}/${testfile}
+    set srcfile watch_thread_num.c
+    set binfile ${objdir}/${subdir}/${testfile}-watch_thread_num
     set gdb_prompt $old_gdb_prompt
 
     if { ![get_compiler_info ${binfile}] && [gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] == "" } {
--- a/gdb/testsuite/gdb.base/commands.exp
+++ b/gdb/testsuite/gdb.base/commands.exp
@@ -25,20 +25,10 @@ if $tracelevel then {
 set prms_id 0
 set bug_id 0
 
-set testfile "run"
-set srcfile ${testfile}.c
-set binfile ${objdir}/${subdir}/commands
-if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DFAKEARGV}] != "" } {
-     untested commands.exp
-     return -1
+if { [prepare_for_testing commands.exp commands run.c {debug additional_flags=-DFAKEARGV}] } {
+    return -1
 }
 
-gdb_exit
-gdb_start
-delete_breakpoints
-gdb_reinitialize_dir $srcdir/$subdir
-gdb_load ${binfile}
-
 proc gdbvar_simple_if_test {} {
     global gdb_prompt
 
--- a/gdb/testsuite/gdb.base/finish.exp
+++ b/gdb/testsuite/gdb.base/finish.exp
@@ -23,12 +23,8 @@ set prms_id 0
 set bug_id 0
 
 # re-use the program from the "return2" test.
-set testfile "return2"
-set srcfile ${testfile}.c
-set binfile ${objdir}/${subdir}/${testfile}
-if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
-     untested finish.exp
-     return -1
+if { [prepare_for_testing finish.exp finish return2.c] } {
+    return -1
 }
 
 proc finish_1 { type } {
@@ -128,12 +124,5 @@ proc finish_tests { } {
     finish_abbreviation "fin"
 }
 
-# Start with a fresh gdb.
-
-gdb_exit
-gdb_start
-gdb_reinitialize_dir $srcdir/$subdir
-gdb_load ${binfile}
-
 set timeout 30
 finish_tests
--- a/gdb/testsuite/gdb.base/float.exp
+++ b/gdb/testsuite/gdb.base/float.exp
@@ -29,19 +29,10 @@ if $tracelevel {
 set prms_id 0
 set bug_id 0
 
-set testfile "run"
-set srcfile ${testfile}.c
-set binfile ${objdir}/${subdir}/${testfile}
-if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
-    untested float.exp
+if { [prepare_for_testing float.exp float run.c] } {
     return -1
 }
 
-gdb_exit
-gdb_start
-gdb_reinitialize_dir $srcdir/$subdir
-gdb_load ${binfile}
-
 # Set it up at a breakpoint so we have its registers.
 
 if ![runto_main] then {
--- a/gdb/testsuite/gdb.base/info-target.exp
+++ b/gdb/testsuite/gdb.base/info-target.exp
@@ -20,18 +20,11 @@ if $tracelevel then {
 set prms_id 0
 set bug_id 0
 
-set testfile start
-set srcfile ${testfile}.c
-set binfile ${objdir}/${subdir}/${testfile}
-if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
+set testfile info-target
+if { [prepare_for_testing ${testfile}.exp $testfile start.c] } {
     return -1
 }
 
-gdb_exit
-gdb_start
-gdb_reinitialize_dir $srcdir/$subdir
-gdb_load ${binfile}
-
 set eol "\[\r\n\]+"
 
 # Check the output of "info target".  Note that we are not interested
--- a/gdb/testsuite/gdb.base/relational.exp
+++ b/gdb/testsuite/gdb.base/relational.exp
@@ -31,23 +31,13 @@ if $tracelevel then {
 set prms_id 0
 set bug_id 0
 
-set testfile "int-type"
-set srcfile ${testfile}.c
-set binfile ${objdir}/${subdir}/${testfile}
-if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } {
-     untested relational.exp
-     return -1
-    }
-
-if [get_compiler_info ${binfile}] {
-    return -1;
+if { [prepare_for_testing relational.exp relational int-type.c {debug nowarnings}] } {
+    return -1
 }
 
-gdb_exit
-gdb_start
-gdb_reinitialize_dir $srcdir/$subdir
-gdb_load ${binfile}
-
+if [get_compiler_info not-used] {
+    return -1;
+}
 
 #
 # set it up at a breakpoint so we can play with the variable values
--- a/gdb/testsuite/gdb.base/sect-cmd.exp
+++ b/gdb/testsuite/gdb.base/sect-cmd.exp
@@ -35,9 +35,9 @@ if ![istarget "hppa*-*-hpux*"] then {
   return
 }
 
-set testfile "break"
-set srcfile ${testfile}.c
-set srcfile1 ${testfile}1.c
+set testfile "sect-cmd"
+set srcfile break.c
+set srcfile1 break1.c
 set binfile ${objdir}/${subdir}/${testfile}
 
 if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}0.o" object {debug nowarnings}] != "" } {
--- a/gdb/testsuite/gdb.base/term.exp
+++ b/gdb/testsuite/gdb.base/term.exp
@@ -38,20 +38,10 @@ gdb_start
 set prms_id 0
 set bug_id 0
 
-set testfile "run"
-set srcfile ${testfile}.c
-set binfile ${objdir}/${subdir}/${testfile}
-if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
-     untested term.exp
-     return -1
+if { [prepare_for_testing term.exp term run.c] } {
+    return -1
 }
 
-gdb_exit
-gdb_start
-delete_breakpoints
-gdb_reinitialize_dir $srcdir/$subdir
-gdb_load ${binfile}
-
 gdb_test "set print sevenbit-strings" "" "test set print sevenbit-strings"
 gdb_test "set print address off" "" "test set print address off"
 gdb_test "set width 0" "" "test set width 0"
--- a/gdb/testsuite/gdb.base/until.exp
+++ b/gdb/testsuite/gdb.base/until.exp
@@ -19,31 +19,11 @@ if $tracelevel then {
     strace $tracelevel
 }
 
-set testfile "break"
-set srcfile ${testfile}.c
-set srcfile1 ${testfile}1.c
-set binfile ${objdir}/${subdir}/${testfile}
-
-if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}0.o" object {debug nowarnings}] != "" } {
-     untested until.exp
-     return -1
-}
-
-if  { [gdb_compile "${srcdir}/${subdir}/${srcfile1}" "${binfile}1.o" object {debug nowarnings}] != "" } {
-     untested until.exp
-     return -1
+set srcfile break.c
+if { [prepare_for_testing until.exp "until" {break.c break1.c} {debug nowarnings}] } {
+    return -1
 }
 
-if  { [gdb_compile "${binfile}0.o ${binfile}1.o" "${binfile}" executable {debug nowarnings}] != "" } {
-     untested until.exp
-     return -1
-}
-
-gdb_exit
-gdb_start
-gdb_reinitialize_dir $srcdir/$subdir
-gdb_load ${binfile}
-
 set bp_location1 [gdb_get_line_number "set breakpoint 1 here"]
 set bp_location19 [gdb_get_line_number "set breakpoint 19 here"]
 set bp_location20 [gdb_get_line_number "set breakpoint 20 here"]
--- a/gdb/testsuite/gdb.base/volatile.exp
+++ b/gdb/testsuite/gdb.base/volatile.exp
@@ -42,26 +42,16 @@ set bug_id 0
 
 # Use the same test program constvars.c.
 
-set testfile "constvars"
-set srcfile ${testfile}.c
-set binfile ${objdir}/${subdir}/${testfile}
+if { [prepare_for_testing volatile.exp volatile constvars.c] } {
+    return -1
+}
 
 # Create and source the file that provides information about the compiler
 # used to compile the test case.
-if [get_compiler_info ${binfile}] {
+if [get_compiler_info not-used] {
     return -1;
 }
 
-if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable debug ] != "" } {
-     untested volatile.exp
-     return -1
-}
-
-gdb_exit
-gdb_start
-gdb_reinitialize_dir $srcdir/$subdir
-gdb_load ${binfile}
-
 #
 # set it up at a breakpoint so we can play with the variable values
 #
--- a/gdb/testsuite/gdb.base/whatis-exp.exp
+++ b/gdb/testsuite/gdb.base/whatis-exp.exp
@@ -35,20 +35,9 @@ if $tracelevel then {
 set prms_id 0
 set bug_id 0
 
-set testfile "int-type"
-set srcfile ${testfile}.c
-set binfile ${objdir}/${subdir}/${testfile}
-if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } {
-     untested whatis-exp.exp
-     return -1
-    }
-
-
-gdb_exit
-gdb_start
-gdb_reinitialize_dir $srcdir/$subdir
-gdb_load ${binfile}
-
+if { [prepare_for_testing whatis-exp.exp whatis-exp int-type.c {debug nowarnings}] } {
+    return -1
+}
 
 #
 # set it up at a breakpoint so we can play with the variable values



More information about the Gdb-patches mailing list