xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/testsuite/gdb.threads/attach-into-signal.exp (revision 8b657b0747480f8989760d71343d6dd33f8d4cf9)
1# Copyright 2008-2023 Free Software Foundation, Inc.
2
3# This program is free software; you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation; either version 3 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16# This test was created by modifying attach-stopped.exp.
17# This file was created by Jan Kratochvil <jan.kratochvil@redhat.com>.
18
19# This test only works on Linux
20if { ![isnative] || [is_remote host] || [use_gdb_stub]
21     || ![istarget *-linux*] } {
22    return
23}
24
25standard_testfile
26set executable_nothr ${testfile}-nothr
27set executable_thr ${testfile}-thr
28
29proc corefunc { threadtype executable } {
30    global srcfile
31    global srcdir
32    global subdir
33    global gdb_prompt
34
35    with_test_prefix "$threadtype" {
36	clean_restart ${executable}
37
38	set binfile [standard_output_file $executable]
39	set escapedbinfile [string_to_regexp ${binfile}]
40
41	gdb_test "handle SIGALRM stop print pass" "Yes.*Yes.*Yes.*"
42
43	set test_spawn_id [spawn_wait_for_attach $binfile]
44	set testpid [spawn_id_get_pid $test_spawn_id]
45
46	# Run 2 passes of the test.
47	# The C file inferior stops pending its signals if a single one is lost,
48	# we test successful redelivery of the caught signal by the 2nd pass.
49
50	# linux-2.6.20.4.x86_64 had maximal attempt # 20 in 4 test runs.
51	set attempts 100
52	set attempt 1
53	set passes 1
54	while { $passes < 3 && $attempt <= $attempts } {
55	    set test "attach (pass $passes), pending signal catch"
56	    if {[gdb_test_multiple "attach $testpid" $test {
57		-re "Attaching to program.*`?$escapedbinfile'?, process $testpid.* received signal SIGALRM.*$gdb_prompt $" {
58		    # nonthreaded:
59		    pass $test
60		    verbose -log "$test succeeded on the attempt # $attempt of $attempts"
61		    set passes [expr $passes + 1]
62		}
63		-re "Attaching to program.*`?$escapedbinfile'?, process $testpid.*$gdb_prompt $" {
64		    set ok 0
65
66		    if { $threadtype == "threaded" } {
67			# In the threaded case, the signal is left
68			# pending on the second thread.  Check for
69			# that by peeking at the thread's siginfo.
70			# SIGALRM is 14, SIGSTOP is 19.
71
72			set test2 "thread apply 2 print \$_siginfo.si_signo"
73			gdb_test_multiple $test2 $test2 {
74			    -re " = 14\r\n$gdb_prompt $" {
75				set ok 1
76			    }
77			    -re " = 19\r\n$gdb_prompt $" {
78			    }
79			}
80		    } else {
81			# In the nonthreaded case, GDB should tell the
82			# user about having seen a signal.
83		    }
84
85		    if { $ok == 0} {
86			# We just lack the luck, we should try it again.
87			set attempt [expr $attempt + 1]
88		    } else {
89			pass $test
90			verbose -log "$test succeeded on the attempt # $attempt of $attempts"
91			set passes [expr $passes + 1]
92		    }
93		}
94	    }] != 0 } {
95		break
96	    }
97
98	    gdb_test -nopass "detach" "Detaching from.*"
99	}
100
101	if {$passes < 3} {
102	    if {$attempt > $attempts} {
103		unresolved $test
104	    } else {
105		fail $test
106	    }
107	}
108
109	# Exit and detach the process.
110	gdb_exit
111
112	# Continue the program - some Linux kernels need it before -9 if the
113	# process is stopped.
114	remote_exec build "kill -s CONT ${testpid}"
115
116	kill_wait_spawned_process $test_spawn_id
117    }
118}
119
120# build the test case first without threads
121#
122if {[build_executable $testfile $executable_nothr $srcfile] == -1} {
123    untested "attach-into-signal.exp (nonthreaded)"
124    return -1
125}
126
127corefunc nonthreaded ${executable_nothr}
128
129# build the test case also with threads
130#
131if  { [gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" [standard_output_file ${executable_thr}] executable {debug additional_flags=-DUSE_THREADS}] != "" } {
132    untested "attach-into-signal.exp (threaded)"
133    return -1
134}
135
136corefunc threaded ${executable_thr}
137