summaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.server/stop-reply-no-thread.exp
blob: 823bdf894c095b373e82c60a77ae4a06c395f51e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# This testcase is part of GDB, the GNU debugger.
#
# Copyright 2018-2021 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 3 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, see <http://www.gnu.org/licenses/>.

# Test backward compatibility with older GDBservers which did not
# include ";thread:NNN" in T stop replies when debugging
# single-threaded programs, even though they'd list the main thread in
# response to qfThreadInfo/qsThreadInfo.  See PR remote/22597.

load_lib gdbserver-support.exp

if { [skip_gdbserver_tests] } {
    verbose "skipping gdbserver tests"
    return -1
}

standard_testfile
if { [build_executable "failed to prepare" $testfile $srcfile] == -1 } {
    return -1
}

# Run the tests with different features of GDBserver disabled.
proc run_test { disable_feature target_nonstop } {
    global binfile gdb_prompt decimal GDBFLAGS

    save_vars { GDBFLAGS } {
	# If GDB and GDBserver are both running locally, set the sysroot to avoid
	# reading files via the remote protocol.
	if { ![is_remote host] && ![is_remote target] } {
	    set GDBFLAGS "$GDBFLAGS -ex \"set sysroot\""
	}

	clean_restart ${binfile}
    }

    # Make sure we're disconnected, in case we're testing with an
    # extended-remote board, therefore already connected.
    gdb_test "disconnect" ".*"

    set packet_arg ""
    if { $disable_feature != "" } {
	set packet_arg "--disable-packet=${disable_feature}"
    }
    set res [gdbserver_start $packet_arg $binfile]
    set gdbserver_protocol [lindex $res 0]
    set gdbserver_gdbport [lindex $res 1]

    # Disable XML-based thread listing, and multi-process extensions.
    gdb_test_no_output "set remote threads-packet off"
    gdb_test_no_output "set remote multiprocess-feature-packet off"

    # Set target-nonstop mode.
    gdb_test_no_output "maint set target-non-stop ${target_nonstop}"

    set res [gdb_target_cmd $gdbserver_protocol $gdbserver_gdbport]
    if ![gdb_assert {$res == 0} "connect"] {
	return
    }

    # There should be only one thread listed.
    set test "info threads"
    gdb_test_multiple $test $test {
	-re "2 Thread.*$gdb_prompt $" {
	    fail $test
	}
	-re "has terminated.*$gdb_prompt $" {
	    fail $test
	}
	-re "\\\* 1\[\t \]*Thread\[^\r\n\]*\r\n$gdb_prompt $" {
	    pass $test
	}
    }

    gdb_breakpoint "main"

    # Bad GDB behaved like this:
    #  (gdb) c
    #  Cannot execute this command without a live selected thread.
    #  (gdb)
    gdb_test "c" "Breakpoint $decimal, main.*" "continue to main"

    # Continue until exit.  The server sends a 'W' with no PID.
    # Bad GDB gave an error like below when target is nonstop:
    #  (gdb) c
    #  Continuing.
    #  No process or thread specified in stop reply: W00
    gdb_continue_to_end "" continue 1
}

# Disable different features within gdbserver:
#
# Tthread: Start GDBserver, with ";thread:NNN" in T stop replies disabled,
#          emulating old gdbservers when debugging single-threaded programs.
#
# T: Start GDBserver with the entire 'T' stop reply packet disabled,
#    GDBserver will instead send the 'S' stop reply.
foreach_with_prefix to_disable { "" Tthread T } {
    foreach_with_prefix t_nonstop { off on } {
	run_test $to_disable $t_nonstop
    }
}

# Regression for PR gdb/26819: Cover the case when GDBserver does not report
# any threads (i.e. the remote target has no concept of threads).
#
# Scenario 1: Disable 'T' and 'qfThreadInfo' packets
# Scenario 2: Disable all threading packets
foreach_with_prefix to_disable { "T,qfThreadInfo" "threads" } {
    # Non-stop mode not applicable - off.
    run_test $to_disable off
}