| Index: gdb/testsuite/gdb.threads/attach-into-signal.exp
|
| diff --git a/gdb/testsuite/gdb.threads/attach-into-signal.exp b/gdb/testsuite/gdb.threads/attach-into-signal.exp
|
| index db8822208537acee453b128a1302df7e576eb414..c74fafa4842a343f8d02f1da5b619e577109738c 100644
|
| --- a/gdb/testsuite/gdb.threads/attach-into-signal.exp
|
| +++ b/gdb/testsuite/gdb.threads/attach-into-signal.exp
|
| @@ -22,149 +22,162 @@ if { ![isnative] || [is_remote host] || [target_info exists use_gdb_stub]
|
| continue
|
| }
|
|
|
| -set testfile "attach-into-signal"
|
| -set srcfile ${testfile}.c
|
| -set binfile ${objdir}/${subdir}/${testfile}
|
| -set escapedbinfile [string_to_regexp ${objdir}/${subdir}/${testfile}]
|
| +standard_testfile
|
| +set executable_nothr ${testfile}-nothr
|
| +set executable_thr ${testfile}-thr
|
|
|
| -remote_exec build "rm -f ${binfile}"
|
| -# For debugging this test
|
| -#
|
| -#log_user 1
|
| -
|
| -proc corefunc { threadtype } {
|
| +proc corefunc { threadtype executable } {
|
| global srcfile
|
| - global binfile
|
| - global escapedbinfile
|
| global srcdir
|
| global subdir
|
| global gdb_prompt
|
|
|
| - if [get_compiler_info ${binfile}] {
|
| - return -1
|
| - }
|
| + with_test_prefix "$threadtype" {
|
| + clean_restart ${executable}
|
|
|
| - # Start the program running and then wait for a bit, to be sure
|
| - # that it can be attached to.
|
| - # Statistically there is a better chance without giving process a nice.
|
| -
|
| - set testpid [eval exec $binfile &]
|
| - exec sleep 2
|
| -
|
| - # Run 2 passes of the test.
|
| - # The C file inferior stops pending its signals if a single one is lost,
|
| - # we test successful redelivery of the caught signal by the 2nd pass.
|
| -
|
| - # linux-2.6.20.4.x86_64 had maximal attempt # 20 in 4 test runs.
|
| - set attempts 100
|
| - set attempt 1
|
| - set passes 1
|
| - while { $passes < 3 && $attempt <= $attempts } {
|
| - set stoppedtry 0
|
| - while { $stoppedtry < 10 } {
|
| - if [catch {open /proc/${testpid}/status r} fileid] {
|
| - set stoppedtry 10
|
| - break
|
| - }
|
| - gets $fileid line1;
|
| - gets $fileid line2;
|
| - close $fileid;
|
| + set binfile [standard_output_file $executable]
|
| + set escapedbinfile [string_to_regexp ${binfile}]
|
|
|
| - if {![string match "*(stopped)*" $line2]} {
|
| - # No PASS message as we may be looping in multiple attempts.
|
| - break
|
| - }
|
| - sleep 1
|
| - set stoppedtry [expr $stoppedtry + 1]
|
| - }
|
| - if { $stoppedtry >= 10 } {
|
| - verbose -log $line2
|
| - set test "$threadtype: process is still running on the attempt # $attempt of $attempts"
|
| - break
|
| + if [get_compiler_info] {
|
| + return -1
|
| }
|
|
|
| - # Main test:
|
| - set test "$threadtype: attach (pass $passes), pending signal catch"
|
| - if {[gdb_test_multiple "attach $testpid" $test {
|
| - -re "Attaching to program.*`?$escapedbinfile'?, process $testpid.*Received Alarm clock.*$gdb_prompt $" {
|
| - # nonthreaded:
|
| - pass $test
|
| - verbose -log "$test succeeded on the attempt # $attempt of $attempts"
|
| - set passes [expr $passes + 1]
|
| - }
|
| - -re "Attaching to program.*`?$escapedbinfile'?, process $testpid.*$gdb_prompt $" {
|
| - # nonthreaded:
|
| - # We just lack the luck, we should try it again.
|
| - set attempt [expr $attempt + 1]
|
| + gdb_test "handle SIGALRM stop print pass" "Yes.*Yes.*Yes.*"
|
| +
|
| + # Start the program running and then wait for a bit, to be sure
|
| + # that it can be attached to.
|
| + # Statistically there is a better chance without giving process a nice.
|
| +
|
| + set testpid [eval exec $binfile &]
|
| + exec sleep 2
|
| +
|
| + # Run 2 passes of the test.
|
| + # The C file inferior stops pending its signals if a single one is lost,
|
| + # we test successful redelivery of the caught signal by the 2nd pass.
|
| +
|
| + # linux-2.6.20.4.x86_64 had maximal attempt # 20 in 4 test runs.
|
| + set attempts 100
|
| + set attempt 1
|
| + set passes 1
|
| + while { $passes < 3 && $attempt <= $attempts } {
|
| + set stoppedtry 0
|
| + while { $stoppedtry < 10 } {
|
| + if [catch {open /proc/${testpid}/status r} fileid] {
|
| + set stoppedtry 10
|
| + break
|
| + }
|
| + gets $fileid line1;
|
| + gets $fileid line2;
|
| + close $fileid;
|
| +
|
| + if {![string match "*(stopped)*" $line2]} {
|
| + # No PASS message as we may be looping in multiple
|
| + # attempts.
|
| + break
|
| + }
|
| + sleep 1
|
| + set stoppedtry [expr $stoppedtry + 1]
|
| }
|
| - -re "Attaching to process $testpid.*Received Alarm clock.*$gdb_prompt $" {
|
| - # threaded:
|
| - pass $test
|
| - verbose -log "$test succeeded on the attempt # $attempt of $attempts"
|
| - set passes [expr $passes + 1]
|
| + if { $stoppedtry >= 10 } {
|
| + verbose -log $line2
|
| + set test "process is still running on the attempt # $attempt of $attempts"
|
| + break
|
| }
|
| - -re "Attaching to process $testpid.*$gdb_prompt $" {
|
| - # threaded:
|
| - # We just lack the luck, we should try it again.
|
| - set attempt [expr $attempt - 1]
|
| +
|
| + # Main test:
|
| + set test "attach (pass $passes), pending signal catch"
|
| + if {[gdb_test_multiple "attach $testpid" $test {
|
| + -re "Attaching to program.*`?$escapedbinfile'?, process $testpid.*Program received signal SIGALRM.*$gdb_prompt $" {
|
| + # nonthreaded:
|
| + pass $test
|
| + verbose -log "$test succeeded on the attempt # $attempt of $attempts"
|
| + set passes [expr $passes + 1]
|
| + }
|
| + -re "Attaching to program.*`?$escapedbinfile'?, process $testpid.*$gdb_prompt $" {
|
| + set ok 0
|
| +
|
| + if { $threadtype == "threaded" } {
|
| + # In the threaded case, the signal is left
|
| + # pending on the second thread. Check for
|
| + # that by peeking at the thread's siginfo.
|
| + # SIGALRM is 14, SIGSTOP is 19.
|
| +
|
| + # With remote targets, we need to pull the
|
| + # thread list explicitly before GDB even knows
|
| + # about thread 2.
|
| + set test2 "pull thread list"
|
| + gdb_test_multiple "info threads" $test2 {
|
| + -re "\r\n$gdb_prompt $" {
|
| + }
|
| + }
|
| +
|
| + set test2 "thread apply 2 print \$_siginfo.si_signo"
|
| + gdb_test_multiple $test2 $test2 {
|
| + -re " = 14\r\n$gdb_prompt $" {
|
| + set ok 1
|
| + }
|
| + -re " = 19\r\n$gdb_prompt $" {
|
| + }
|
| + }
|
| + } else {
|
| + # In the nonthreaded case, GDB should tell the
|
| + # user about having seen a signal.
|
| + }
|
| +
|
| + if { $ok == 0} {
|
| + # We just lack the luck, we should try it again.
|
| + set attempt [expr $attempt + 1]
|
| + } else {
|
| + pass $test
|
| + verbose -log "$test succeeded on the attempt # $attempt of $attempts"
|
| + set passes [expr $passes + 1]
|
| + }
|
| + }
|
| + }] != 0 } {
|
| + break
|
| }
|
| - }] != 0 } {
|
| - break
|
| - }
|
|
|
| - gdb_test "detach" "Detaching from.*" ""
|
| - }
|
| - if {$passes < 3} {
|
| - if {$attempt > $attempts} {
|
| - unresolved $test
|
| - } else {
|
| - fail $test
|
| + gdb_test "detach" "Detaching from.*" ""
|
| + }
|
| + if {$passes < 3} {
|
| + if {$attempt > $attempts} {
|
| + unresolved $test
|
| + } else {
|
| + fail $test
|
| + }
|
| }
|
| - }
|
|
|
| - # Exit and detach the process.
|
| + # Exit and detach the process.
|
|
|
| - gdb_exit
|
| + gdb_exit
|
|
|
| - # Make sure we don't leave a process around to confuse
|
| - # the next test run (and prevent the compile by keeping
|
| - # the text file busy), in case the "set should_exit" didn't
|
| - # work.
|
| + # Make sure we don't leave a process around to confuse the
|
| + # next test run (and prevent the compile by keeping the text
|
| + # file busy), in case the "set should_exit" didn't work.
|
|
|
| - # Continue the program - some Linux kernels need it before -9 if the
|
| - # process is stopped.
|
| - remote_exec build "kill -s CONT ${testpid}"
|
| + # Continue the program - some Linux kernels need it before -9 if the
|
| + # process is stopped.
|
| + remote_exec build "kill -s CONT ${testpid}"
|
|
|
| - remote_exec build "kill -9 ${testpid}"
|
| -}
|
| + remote_exec build "kill -9 ${testpid}"
|
|
|
| -# Start with clean gdb
|
| -gdb_exit
|
| + }
|
| +}
|
|
|
| # build the test case first without threads
|
| #
|
| -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
|
| - untested "attach-into-signal.exp (unthreaded)"
|
| +if {[build_executable $testfile $executable_nothr $srcfile] == -1} {
|
| + untested "attach-into-signal.exp (nonthreaded)"
|
| return -1
|
| }
|
|
|
| -gdb_start
|
| -gdb_reinitialize_dir $srcdir/$subdir
|
| -gdb_load ${binfile}
|
| -gdb_test_no_output "set debug lin-lwp 1" ""
|
| -
|
| -corefunc nonthreaded
|
| +corefunc nonthreaded ${executable_nothr}
|
|
|
| # build the test case also with threads
|
| #
|
| -if { [gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DUSE_THREADS}] != "" } {
|
| +if { [gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" [standard_output_file ${executable_thr}] executable {debug additional_flags=-DUSE_THREADS}] != "" } {
|
| untested "attach-into-signal.exp (threaded)"
|
| return -1
|
| }
|
|
|
| -gdb_start
|
| -gdb_reinitialize_dir $srcdir/$subdir
|
| -gdb_load ${binfile}
|
| -gdb_test_no_output "set debug lin-lwp 1" ""
|
| -
|
| -corefunc threaded
|
| +corefunc threaded ${executable_thr}
|
|
|