* [patch] testsuite: Fix racy clashing for gdb.base{1,2}/ parallel run
@ 2009-07-13 0:47 Jan Kratochvil
2009-07-13 17:08 ` Tom Tromey
0 siblings, 1 reply; 3+ messages in thread
From: Jan Kratochvil @ 2009-07-13 0:47 UTC (permalink / raw)
To: gdb-patches; +Cc: Tom Tromey
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
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [patch] testsuite: Fix racy clashing for gdb.base{1,2}/ parallel run
2009-07-13 0:47 [patch] testsuite: Fix racy clashing for gdb.base{1,2}/ parallel run Jan Kratochvil
@ 2009-07-13 17:08 ` Tom Tromey
2009-07-13 19:30 ` Jan Kratochvil
0 siblings, 1 reply; 3+ messages in thread
From: Tom Tromey @ 2009-07-13 17:08 UTC (permalink / raw)
To: Jan Kratochvil; +Cc: gdb-patches
>>>>> "Jan" == Jan Kratochvil <jan.kratochvil@redhat.com> writes:
Jan> randomly some testcases fail now with paralell testsuite due to:
Thanks for finding and fixing this.
Jan> Some scripts have bugs so that their binary files are created in
Jan> the current directory (and not in ${subdir}). Therefore if there
Jan> would be a change so that the current directory is always in
Jan> ${objdir} (therefore in gdb.base1) it may be better to globally
Jan> change the current directory to be in ${objdir}/${subdir}.
Yeah, consistency here would be nice.
This patch is ok. I didn't know about prepare_for_testing -- it seems
to me that we should use this more.
Tom
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [patch] testsuite: Fix racy clashing for gdb.base{1,2}/ parallel run
2009-07-13 17:08 ` Tom Tromey
@ 2009-07-13 19:30 ` Jan Kratochvil
0 siblings, 0 replies; 3+ messages in thread
From: Jan Kratochvil @ 2009-07-13 19:30 UTC (permalink / raw)
To: Tom Tromey; +Cc: gdb-patches
On Mon, 13 Jul 2009 18:29:17 +0200, Tom Tromey wrote:
> This patch is ok.
Checked-in:
http://sourceware.org/ml/gdb-cvs/2009-07/msg00100.html
Thanks,
Jan
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2009-07-13 19:22 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-07-13 0:47 [patch] testsuite: Fix racy clashing for gdb.base{1,2}/ parallel run Jan Kratochvil
2009-07-13 17:08 ` Tom Tromey
2009-07-13 19:30 ` Jan Kratochvil
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox