| Index: gdb/testsuite/gdb.base/siginfo-thread.exp
|
| diff --git a/gdb/testsuite/gdb.base/siginfo-obj.exp b/gdb/testsuite/gdb.base/siginfo-thread.exp
|
| similarity index 52%
|
| copy from gdb/testsuite/gdb.base/siginfo-obj.exp
|
| copy to gdb/testsuite/gdb.base/siginfo-thread.exp
|
| index 9ca649dae874621801cc554c53d7c3bef3befdde..a3518029a37d243a245232af5779ea1ef37db3bc 100644
|
| --- a/gdb/testsuite/gdb.base/siginfo-obj.exp
|
| +++ b/gdb/testsuite/gdb.base/siginfo-thread.exp
|
| @@ -1,4 +1,4 @@
|
| -# Copyright 2004, 2007-2008, 2010-2012 Free Software Foundation, Inc.
|
| +# Copyright 2004-2013 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
|
| @@ -14,48 +14,41 @@
|
| # along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
| -# The program siginfo-obj.c arranges for a signal handler registered
|
| -# using sigaction's sa_sigaction / SA_SIGINFO to be called with
|
| -# si_addr filled in.
|
| -
|
| -# This test confirms that we can inspect signal info using the
|
| -# $_siginfo convenience variable.
|
| +# Multi-threaded siginfo test.
|
|
|
| if [target_info exists gdb,nosignals] {
|
| - verbose "Skipping siginfo-obj.exp because of nosignals."
|
| + verbose "Skipping siginfo-thread.exp because of nosignals."
|
| continue
|
| }
|
|
|
| if { ! [istarget "i?86-*-linux*"]
|
| && ! [istarget "x86_64-*-linux*"]
|
| && ! [istarget "arm*-*-linux*"] } {
|
| - verbose "Skipping siginfo-obj.exp because of lack of support."
|
| + verbose "Skipping siginfo-thread.exp because of lack of support."
|
| return
|
| }
|
|
|
| +standard_testfile .c
|
|
|
| -set testfile siginfo-obj
|
| -set srcfile ${testfile}.c
|
| -set binfile ${objdir}/${subdir}/${testfile}
|
| -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
|
| - untested "Couldn't compile ${srcfile}.c"
|
| +if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" \
|
| + "${binfile}" executable {debug}] != "" } {
|
| return -1
|
| }
|
|
|
| -# get things started
|
| -gdb_exit
|
| -gdb_start
|
| -gdb_reinitialize_dir $srcdir/$subdir
|
| -gdb_load ${binfile}
|
| +clean_restart $binfile
|
|
|
| # Advance to main
|
| if { ![runto_main] } then {
|
| - gdb_suppress_tests;
|
| + gdb_suppress_tests
|
| }
|
|
|
| # Run to the signal.
|
| gdb_test "continue" ".*Program received signal SIGSEGV.*" "continue to signal"
|
|
|
| +# Try to generate a core file, for a later test.
|
| +set gcorefile [standard_output_file $testfile.gcore]
|
| +set gcore_created [gdb_gcore_cmd $gcorefile "save a core file"]
|
| +
|
| set ssi_addr ""
|
| set test "Extract si_addr"
|
| gdb_test_multiple "p \$_siginfo" "$test" {
|
| @@ -99,27 +92,37 @@ gdb_test "p ssi_errno" " = $ssi_errno"
|
| gdb_test "p ssi_code" " = $ssi_code"
|
| gdb_test "p ssi_signo" " = $ssi_signo"
|
|
|
| -# Again, but this time, patch si_addr and check that the inferior sees
|
| -# the changed value.
|
| -
|
| -# Advance to main
|
| -if { ![runto_main] } then {
|
| - gdb_suppress_tests;
|
| +gdb_test "thread 1" ".*"
|
| +# siginfo is available here -- it shows SIGSTOP -- so we test to make
|
| +# sure that we have a different signal from the SEGV thread.
|
| +gdb_test "p \$_siginfo.si_signo == $ssi_signo" " = 0" \
|
| + "test signal in main thread"
|
| +
|
| +# Test siginfo preservation in core files.
|
| +if {$gcore_created} {
|
| + clean_restart $binfile
|
| +
|
| + gdb_test "core $gcorefile" "Core was generated by.*" \
|
| + "core [file tail $gcorefile]"
|
| +
|
| + gdb_test "p \$_siginfo.si_signo" " = $ssi_signo" \
|
| + "p \$_siginfo.si_signo from core file"
|
| + gdb_test "p \$_siginfo.si_errno" " = $ssi_errno" \
|
| + "p \$_siginfo.si_errno from core file"
|
| + gdb_test "p \$_siginfo.si_code" " = $ssi_code" \
|
| + "p \$_siginfo.si_code from core file"
|
| + gdb_test "p \$_siginfo._sifields._sigfault.si_addr" \
|
| + " = \\(void \\*\\) $ssi_addr" \
|
| + "p \$_siginfo._sifields._sigfault.si_addr from core file"
|
| +
|
| + # We don't know which thread will be signalled, so we simply
|
| + # ensure that only one thread got a SEGV.
|
| + gdb_test_no_output "set variable \$count = 0"
|
| + foreach thread {1 2} {
|
| + gdb_test "thread $thread" ".*" "select thread $thread with core file"
|
| + gdb_test_no_output \
|
| + "set variable \$count += (\$_siginfo.si_signo == $ssi_signo)" \
|
| + "update counter in thread $thread"
|
| + }
|
| + gdb_test "print \$count" " = 1"
|
| }
|
| -
|
| -# Run to the signal.
|
| -gdb_test "continue" ".*Program received signal SIGSEGV.*" "continue to signal"
|
| -
|
| -set test "Set si_addr"
|
| -gdb_test "p \$_siginfo._sifields._sigfault.si_addr = 0x666" " = \\(void \\*\\) 0x666"
|
| -gdb_test "p \$_siginfo.si_errno = 666" " = 666"
|
| -gdb_test "p \$_siginfo.si_code = 999" " = 999"
|
| -gdb_test "p \$_siginfo.si_signo = 11" " = 11"
|
| -
|
| -gdb_test "break $bp_location"
|
| -gdb_test "continue" ".* handler .*" "continue to handler"
|
| -
|
| -gdb_test "p ssi_addr" " = \\(void \\*\\) 0x666"
|
| -gdb_test "p ssi_errno" " = 666"
|
| -gdb_test "p ssi_code" " = 999"
|
| -gdb_test "p ssi_signo" " = 11"
|
|
|