diff options
author | Bob Manson <manson@cygnus> | 1997-01-29 09:40:31 +0000 |
---|---|---|
committer | Bob Manson <manson@cygnus> | 1997-01-29 09:40:31 +0000 |
commit | 787f6220773d9174a9675dedd3bbfc8f070511a6 (patch) | |
tree | 64911c10d46bc93973cc825a730b4173b3367a49 /gdb/testsuite/gdb.threads | |
parent | 1a2faf1f1e335ff32c1d8c5c7675cd7ce9055e33 (diff) | |
download | gdb-787f6220773d9174a9675dedd3bbfc8f070511a6.zip gdb-787f6220773d9174a9675dedd3bbfc8f070511a6.tar.gz gdb-787f6220773d9174a9675dedd3bbfc8f070511a6.tar.bz2 |
Major revision to testsuites for cross-testing and DOS testing support.
Diffstat (limited to 'gdb/testsuite/gdb.threads')
-rw-r--r-- | gdb/testsuite/gdb.threads/pthreads.exp | 125 | ||||
-rw-r--r-- | gdb/testsuite/gdb.threads/step.exp | 200 | ||||
-rw-r--r-- | gdb/testsuite/gdb.threads/step2.exp | 150 |
3 files changed, 441 insertions, 34 deletions
diff --git a/gdb/testsuite/gdb.threads/pthreads.exp b/gdb/testsuite/gdb.threads/pthreads.exp index 93ef5cd..a2bc4e0 100644 --- a/gdb/testsuite/gdb.threads/pthreads.exp +++ b/gdb/testsuite/gdb.threads/pthreads.exp @@ -26,15 +26,49 @@ if $tracelevel then { set prms_id 0 set bug_id 0 +# This only works with native configurations +if ![isnative] then { + return +} + set testfile "pthreads" set srcfile ${testfile}.c set binfile ${objdir}/${subdir}/${testfile} -set ccout [compile "${srcdir}/${subdir}/${srcfile} -I${objdir}/${subdir} -g -o ${binfile} -lpthread"] -switch -regexp -- $ccout { - ".*no posix threads support.*" { return 0 } - {^$} { pass "successfully compiled posix threads test case" } - default { perror "Couldn't compile ${srcfile}" ; return -1 } + +set built_binfile 0 +if [istarget "*-*-linux"] then { + set target_cflags "-D_MIT_POSIX_THREADS" +} else { + set target_cflags "" +} +set why_msg "unrecognized error" +foreach lib {-lpthreads -lpthread} { + set options "debug" + lappend options "incdir=${objdir}/${subdir}" + lappend options "libs=$lib" + set ccout [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable $options] + switch -regexp -- $ccout { + ".*no posix threads support.*" { + set why_msg "missing threads include file" + break + } + ".*cannot open -lpthread.*" { + set why_msg "missing runtime threads library" + } + ".*Can't find library for -lpthread.*" { + set why_msg "missing runtime threads library" + } + {^$} { + pass "successfully compiled posix threads test case" + set built_binfile 1 + break + } } +} +if {$built_binfile == "0"} { + unsupported "Couldn't compile ${srcfile}, ${why_msg}" + return -1 +} # Now we can proceed with the real testing. @@ -45,16 +79,16 @@ gdb_start gdb_reinitialize_dir $srcdir/$subdir gdb_load ${binfile} -send "set print sevenbit-strings\n" ; expect -re "$prompt $" -#send "set print address off\n" ; expect -re "$prompt $" -send "set width 0\n" ; expect -re "$prompt $" +gdb_test "set print sevenbit-strings" "" +#gdb_test "set print address off" "" +gdb_test "set width 0" "" -# We'll need this when we send a ^C to GDB. Need to do it before we +# We'll need this when we send_gdb a ^C to GDB. Need to do it before we # run the program and gdb starts saving and restoring tty states. # On Ultrix, we don't need it and it is really slow (because shell_escape # doesn't use vfork). if ![istarget "*-*-ultrix*"] then { - send "shell stty intr '^C'\n" ; expect -re "$prompt $" + gdb_test "shell stty intr '^C'" "" } proc all_threads_running {} { @@ -62,26 +96,26 @@ proc all_threads_running {} { global srcfile # Reset all the counters to zero. - send "set var common_routine::hits=0\n" ; expect -re "$prompt $" - send "set var common_routine::from_thread1=0\n" ; expect -re "$prompt $" - send "set var common_routine::from_thread2=0\n" ; expect -re "$prompt $" - send "set var common_routine::from_main=0\n" ; expect -re "$prompt $" - send "set var common_routine::full_coverage=0\n" ; expect -re "$prompt $" + gdb_test "set var common_routine::hits=0" "" + gdb_test "set var common_routine::from_thread1=0" "" + gdb_test "set var common_routine::from_thread2=0" "" + gdb_test "set var common_routine::from_main=0" "" + gdb_test "set var common_routine::full_coverage=0" "" # Disable all breakpoints. - send "disable\n" ; expect -re "$prompt $" + gdb_test "disable" "" # Set up a breakpoint that will cause us to stop when we have # been called 15 times. This should be plenty of time to allow # every thread to run at least once, since each thread sleeps for # one second between calls to common_routine. - send "tbreak common_routine if hits == 15\n"; expect -re "$prompt $" + gdb_test "tbreak common_routine if hits == 15" "" # Start all the threads running again and wait for the inferior # to stop. Since no other breakpoints are set at this time # we should stop only when we have been previously called 15 times. - send "continue\n" + send_gdb "continue\n" expect { -re "Continuing.*common_routine.*at.*$srcfile.*$prompt $" {} default { @@ -97,13 +131,17 @@ proc all_threads_running {} { # Check that we stopped when we actually expected to stop, by # verifying that there have been 15 previous hits. - send "p common_routine::hits\n" + send_gdb "p common_routine::hits\n" expect { -re ".*= 15\r\n$prompt $" {} default { fail "stopped before calling common_routine 15 times" return 0 } + -re ".*$prompt $" { + fail "stopped before clling common_routine 15 times" + return 0 + } timeout { fail "stopped before calling common_routine 15 times (timeout)" return 0 @@ -113,7 +151,7 @@ proc all_threads_running {} { # Also check that all of the threads have run, which will only be true # if the full_coverage variable is set. - send "p common_routine::full_coverage\n" + send_gdb "p common_routine::full_coverage\n" expect { -re ".*= 1\r\n$prompt $" {} default { @@ -135,10 +173,21 @@ proc test_startup {} { global main_id thread1_id thread2_id # We should be able to do an info threads before starting any others. - gdb_test "info threads" ".*Thread.*LWP.*main.*" + send_gdb "info threads\n" + expect { + -re ".*Thread.*LWP.*main.*" { + pass "info threads" + } + -re "\r\n$prompt $" { + pass "info threads" + setup_xfail "*-*-*" + fail "gdb does not support pthreads for this machine" + return 0 + } + } # Extract the thread id number of main thread from "info threads" output. - send "info threads\n" ; expect -re "(\[0-9\]+)(.*Thread.*main.*)($prompt $)" + send_gdb "info threads\n" ; expect -re "(\[0-9\]+)(.*Thread.*main.*)($prompt $)" set main_id $expect_out(1,string) # Check that we can continue and create the first thread. @@ -146,10 +195,10 @@ proc test_startup {} { gdb_test "continue" \ "Continuing.*Breakpoint .*, thread1 \\(arg=0xfeedface\\).*at.*$srcfile.*" \ "Continue to creation of first thread" - send "disable\n" ; expect -re "$prompt $" + gdb_test "disable" "" # Extract the thread id number of thread 1 from "info threads" output. - send "info threads\n" ; expect -re "(\[0-9\]+)(.*Thread.*thread1.*)($prompt $)" + send_gdb "info threads\n" ; expect -re "(\[0-9\]+)(.*Thread.*thread1.*)($prompt $)" set thread1_id $expect_out(1,string) # Check that we can continue and create the second thread, @@ -160,8 +209,10 @@ proc test_startup {} { "Continue to creation of second thread" # Extract the thread id number of thread 2 from "info threads" output. - send "info threads\n" ; expect -re "(\[0-9\]+)(.*Thread.*thread2.*)($prompt $)" + send_gdb "info threads\n" ; expect -re "(\[0-9\]+)(.*Thread.*thread2.*)($prompt $)" set thread2_id $expect_out(1,string) + + return 1 } proc check_control_c {} { @@ -173,9 +224,9 @@ proc check_control_c {} { } # Send a continue followed by ^C to the process to stop it. - send "continue\n" + send_gdb "continue\n" set description "Stopped with a ^C" - after 1000 [send "\003"] + after 1000 [send_gdb "\003"] expect { -re "Program received signal SIGINT.*$prompt $" { pass $description @@ -187,7 +238,7 @@ proc check_control_c {} { fail "$description (timeout)" } } - send "bt\n" ; expect -re "$prompt $" + gdb_test "bt" "" # Verify that all threads can be run again after a ^C stop. if [all_threads_running] then { @@ -224,10 +275,10 @@ proc check_backtraces {} { "Breakpoint .* at 0x.* file .* line .*" \ "set break at common_routine in thread 2" - send "continue\n" + send_gdb "continue\n" expect { -re "Breakpoint .* common_routine \\(arg=2\\).*" { - send "backtrace\n" + send_gdb "backtrace\n" expect { -re "#0.*common_routine \\(arg=2\\).*#1.*thread2.*" { pass "backtrace from thread 2 bkpt in common_routine" @@ -246,18 +297,24 @@ proc check_backtraces {} { -re "Breakpoint .* common_routine \\(arg=1\\).*" { fail "stopped in main thread at breakpoint for thread 1" } + -re ".*$prompt" { + fail "continue to bkpt at common_routine in thread 2" + } default { fail "continue to bkpt at common_routine in thread 2" } timeout { fail "continue to bkpt at common_routine in thread 2 (timeout)" } - } } +setup_xfail "alpha-*-osf*" if [runto_main] then { - test_startup - check_control_c - check_backtraces + clear_xfail "alpha-*-osf*" + if [test_startup] then { + check_control_c + check_backtraces + } } +clear_xfail "alpha-*-osf*" diff --git a/gdb/testsuite/gdb.threads/step.exp b/gdb/testsuite/gdb.threads/step.exp new file mode 100644 index 0000000..284c9b5 --- /dev/null +++ b/gdb/testsuite/gdb.threads/step.exp @@ -0,0 +1,200 @@ +# step.exp -- Expect script to test gdb with step.c +# Copyright (C) 1992 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Hiro Sugawara. (hiro@lynx.com) +# +# This test really needs some major surgery to be acceptable, but +# I'm just about burnt out on lynx work, so I'm not doing it now. +# +# * The test has an indeterminate number of pass/fails +# for each run (it runs a small group of tests until +# it's timer kicks off). This is very bad for nightly +# automated regression testing. +# +# * It tries to "step" from withint he prologue of a +# function. This isn't support in gdb (it's going +# to act like a continue). +# +# * This test rarely check that it stopped in sensible +# places. (see previous bullet -- this test doesn't +# catch the fact it continued rather than stepped) + + +if $tracelevel then { + strace $tracelevel +} + +set program_exited 0 + +proc set_bp { where } { + global prompt + + send_gdb "break $where\n" + # The first regexp is what we get with -g, the second without -g. + expect { + -re "Break.* at .*: file .*, line \[0-9\]*.*$prompt $" {} + -re "Breakpoint \[0-9\]* at 0x\[0-9a-f\]*.*$prompt $" {} + -re "$prompt $" { fail "setting breakpoint at $where" ; return 0 } + timeout { fail "setting breakpoint at $where (timeout)" ; return 0 } + } + pass "set_bp" +} + +proc step_it { cmd } { + global prompt + global program_exited + + send_gdb "$cmd\n" + expect { + -re "0x\[0-9A-Fa-f\]* *in.*\r\n$prompt $" { pass "step_it"; return 0 } + -re "0x\[0-9A-Fa-f\]* *\[0-9\]*.*\r\n$prompt $" { pass "step_it"; return 1 } + -re "Program exited .*\n$prompt $" { + set program_exited 1 + return -1 + } + -re "$prompt $" { fail "single-stepping ($cmd).\n" ; return -1 } + timeout { fail "single-stepping ($cmd) timout.\n" ; return -1 } + } +} + +proc step_inst {} { + step_it "stepi" +} + +proc step_source {} { + step_it "step" +} + +proc continue_all {} { + global prompt + + send_gdb "continue\n" + expect { + -re "Breakpoint \[0-9\]*, thread\[0-9\]* .*$prompt $" { + pass "continue_all" + return 0 + } + -re "Program exited .*\n$prompt $" { + set program_exited 1 + return 1; + } + -re "$prompt $" { fail "continue" ; return -1 } + timeout { fail "continue (timeout)" ; return -1 } + } +} + +proc check_threads { num_threads } { + global prompt + + set curr_thread 0 + send_gdb "info threads\n" + while { $num_threads > 0 } { + expect { + -re "\\* *\[0-9\]* process \[0-9\]* thread \[0-9\]* .*\n" { + incr curr_thread + set num_threads [expr $num_threads - 1] + } + -re " *\[0-9\]* process \[0-9\]* thread \[0-9\]* .*\n" { + set num_threads [expr $num_threads - 1] + } + -re "$prompt $" { + if { $num_threads < 0 } { + fail "check_threads (too many)" ; return -1 + } + break + } + timeout { fail "check_threads (timeout)" ; return -1 } + } + } + + if { $curr_thread == 0 } { + fail "check_threads (no current thread)\n" + return -1 + } + if { $curr_thread > 1 } { + fail "check_threads (more than one current thread)\n" + return -1 + } + return 0 +} + +proc test_cond_wait {} { + global program_exited + + set_bp 135 + runto 179 + while { 1 } { + set stepi_counter 0 + while { [step_inst] } { + if { $program_exited } { break } + incr stepi_counter + if { $stepi_counter > 30 } { + fail "too many stepi's per line\n" + return -1 + } + } + if { $program_exited } { break } + step_source + if { $program_exited } { break } + continue_all + if { $program_exited } { break } + check_threads 3 + } +} + +proc do_tests {} { + global prms_id + global bug_id + global subdir + global objdir + global srcdir + global binfile + global prompt + + set prms_id 0 + set bug_id 0 + + # Start with a fresh gdb. + + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load $objdir/$subdir/$binfile + + send_gdb "set width 0\n" + expect -re "$prompt $" + + test_cond_wait +} + +# Check to see if we have an executable to test. If not, then either we +# haven't tried to compile one, or the compilation failed for some reason. +# In either case, just notify the user and skip the tests in this file. + +set binfile "step" +set srcfile "step.c" + +if ![file exists $objdir/$subdir/$binfile] then { + if $all_flag then { + warning "$binfile does not exist; tests suppressed." + } +} else { + do_tests +} diff --git a/gdb/testsuite/gdb.threads/step2.exp b/gdb/testsuite/gdb.threads/step2.exp new file mode 100644 index 0000000..5827171 --- /dev/null +++ b/gdb/testsuite/gdb.threads/step2.exp @@ -0,0 +1,150 @@ +# step2.exp -- Expect script to test gdb step.c +# Copyright (C) 1992 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Jeff Law. (law@cygnus.com) +# + + +if $tracelevel then { + strace $tracelevel +} + +set program_exited 0 + +# A simple and crude test to see that we can step two threads independently +proc test_multi_threaded_stepping {} { + global prompt + global hex + global srcfile + global decimal + + # Set breakpoints in code that we know is executed in only + # thread of control. + gdb_test "break thread1" \ + "Break.* at $hex: file .*$srcfile, line $decimal\\." + gdb_test "break thread2" \ + "Break.* at $hex: file .*$srcfile, line $decimal\\." + + # the order in which things happen is indeterminate. So we basically + # look for a set of events and note that each one happens and that + # all of the required events have happened when we're done. + # + # Right now we only verify that both threads start and that they + # both call pthread_cond_wait twice. + set thread1started 0 + set thread1condwait 0 + set thread2started 0 + set thread2condwait 0 + + send_gdb "run\n" + expect { + -re "The program .* has been started already.*y or n. $" { + send_gdb "y\n" + exp_continue + } + -re ".*Breakpoint \[0-9\]+,.*thread1.* at .*$srcfile:.*\[\t \].*$prompt $" { + if { $thread1started != 0 } then { + fail "thread1 started" + return + } else { + set thread1started 1 + pass "thread1 started" + } + send_gdb "step\n" + exp_continue + } + -re ".*Breakpoint \[0-9\]+,.*thread2.* at .*$srcfile:.*\[\t \].*$prompt $" { + if { $thread2started != 0 } then { + fail "thread2 started" + return + } else { + set thread2started 1 + pass "thread2 started" + } + send_gdb "step\n" + exp_continue + } + -re ".*pthread_cond_wait.*cv_a.*$prompt" { + if { $thread1started == 0 } then { + fail "thread1 condwait" + return + } + if { $thread1condwait < 2 } then { + pass "thread1 condwait" + incr thread1condwait + } + if { $thread2condwait == 2 } then { + pass "multi threaded stepping" + return + } + send_gdb "step\n" + exp_continue + } + + -re ".*pthread_cond_wait.*cv_b.*$prompt" { + if { $thread2started == 0 } then { + fail "thread2 condwait" + return + } + if { $thread2condwait < 2 } then { + pass "thread2 condwait" + incr thread2condwait + } + if { $thread1condwait == 2 } then { + pass "multi threaded stepping" + return + } + send_gdb "step\n" + exp_continue + } + + -re "$prompt" { + send_gdb "step\n" + exp_continue + } + default { fail "multi threaded stepping" } + } +} + +# Check to see if we have an executable to test. If not, then either we +# haven't tried to compile one, or the compilation failed for some reason. +# In either case, just notify the user and skip the tests in this file. + +set binfile "step" +set srcfile "step.c" + +if ![file exists $objdir/$subdir/$binfile] then { + if $all_flag then { + warning "$binfile does not exist; tests suppressed." + } + return +} + +set prms_id 0 +set bug_id 0 + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load $objdir/$subdir/$binfile + +test_multi_threaded_stepping |