xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/testsuite/gdb.threads/process-dies-while-handling-bp.exp (revision f3cfa6f6ce31685c6c4a758bc430e69eb99f50a4)
1# Copyright (C) 2015-2017 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 spawns a few threads that constantly trip on a breakpoint
17# that does not cause a user-visible stop.  While one of those
18# breakpoints is being handled, the main thread exits the whole
19# process.  The result is that the current thread for which GDB is
20# handling the event disappears too and any attempt to access
21# register/memory now errors out.  GDB and GDBserver should be able to
22# handle this scenario gracefully.
23#
24# See https://sourceware.org/bugzilla/show_bug.cgi?id=18749
25
26standard_testfile
27
28set linenum [gdb_get_line_number "set break here"]
29
30if {[build_executable "failed to prepare" $testfile $srcfile {debug pthreads}] == -1} {
31    return -1
32}
33
34# The test proper.  If COND_BP_TARGET is true, then test with
35# conditional breakpoints evaluated on the target side, if possible.
36
37proc do_test { non_stop cond_bp_target } {
38    global GDBFLAGS
39    global gdb_prompt
40    global binfile
41    global linenum
42
43    set saved_gdbflags $GDBFLAGS
44    set GDBFLAGS [concat $GDBFLAGS " -ex \"set non-stop $non_stop\""]
45    clean_restart $binfile
46    set GDBFLAGS $saved_gdbflags
47
48    if ![runto_main] then {
49	fail "can't run to main"
50	return 0
51    }
52
53    # Whether it's known that the test fails.
54    set should_kfail 0
55
56    if {![gdb_is_target_remote]} {
57	set should_kfail 1
58    } else {
59	if {!$cond_bp_target} {
60	    # Leaving breakpoint evaluation to GDB exposes failures
61	    # similar to native debugging.
62	    gdb_test_no_output "set remote conditional-breakpoints-packet off"
63	    set should_kfail 1
64	} else {
65	    set test "show remote conditional-breakpoints-packet"
66	    gdb_test_multiple $test $test {
67		-re "currently enabled\.\r\n$gdb_prompt $" {
68		    pass $test
69		}
70		-re "currently disabled\.\r\n$gdb_prompt $" {
71		    unsupported "no support for target-side conditional breakpoints"
72		    return
73		}
74	    }
75	    set should_kfail 1
76	}
77    }
78
79    gdb_test "break $linenum if zero == 1" \
80	"Breakpoint .*" \
81	"set breakpoint that evals false"
82
83    set test "continue &"
84    gdb_test_multiple $test $test {
85	-re "$gdb_prompt " {
86	    pass $test
87	}
88    }
89
90    set ok 0
91
92    # Setup the kfail upfront in order to also catch GDB internal
93    # errors.
94    if {$should_kfail} {
95	setup_kfail "gdb/18749" "*-*-*"
96    }
97
98    set test "inferior 1 exited"
99    gdb_test_multiple "" $test {
100	-re "Inferior 1 \(\[^\r\n\]+\) exited normally" {
101	    set ok 1
102
103	    # Clear the kfail to avoid a PASS -> KPASS dance across
104	    # runs.
105	    clear_kfail "*-*-linux*"
106
107	    pass $test
108	}
109	-re "$gdb_prompt " {
110	    # Several errors end up at the top level, and printing the
111	    # prompt.
112	    fail "$test (prompt)"
113	}
114	-re "Cannot access memory" {
115	    fail "$test (memory error)"
116	}
117	eof {
118	    fail "$test (GDB died)"
119	}
120    }
121
122    if {!$ok} {
123	# No use testing further.
124	return
125    }
126
127    gdb_test "info threads" "No threads\." \
128	"no threads left"
129}
130
131foreach_with_prefix non_stop {"on" "off"} {
132    foreach_with_prefix cond_bp_target {1 0} {
133	do_test $non_stop $cond_bp_target
134    }
135}
136