summaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.mi/mi-cli.exp
blob: cb654dabc4aaf39169655c731c9194534a004f71 (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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
# Copyright 2002-2019 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/>.

# This file tests that GDB's console can be accessed via the MI.
# Specifically, we are testing the "interpreter-exec" command and that
# the commands that are executed via this command are properly executed.
# Console commands executed via MI should use MI output wrappers, MI event
# handlers, etc.

load_lib mi-support.exp
set MIFLAGS "-i=mi"

gdb_exit
if [mi_gdb_start] {
    continue
}

standard_testfile basics.c

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested "failed to compile"
     return -1
}

mi_gdb_test "-interpreter-exec" \
  {\^error,msg="-interpreter-exec: Usage: -interpreter-exec interp command"} \
  "-interpreter-exec with no arguments"

mi_gdb_test "-interpreter-exec console" \
  {\^error,msg="-interpreter-exec: Usage: -interpreter-exec interp command"} \
  "-interpreter-exec with one argument"

mi_gdb_test "-interpreter-exec bogus command" \
  {\^error,msg="-interpreter-exec: could not find interpreter \\\"bogus\\\""} \
  "-interpreter-exec with bogus interpreter"

set msg {Undefined command: \\\"bogus\\\"\.  Try \\\"help\\\"\.}
mi_gdb_test "-interpreter-exec console bogus" \
    "&\\\"$msg\\\\n\\\".*\\^error,msg=\\\"$msg\\\".*" \
  "-interpreter-exec console bogus"

# NOTE: cagney/2003-02-03: Not yet.
# mi_gdb_test "-interpreter-exec console \"file $binfile\"" \
#   {(=.*)+\^done} \
#   "-interpreter-exec console \"file \$binfile\""
mi_gdb_test "-interpreter-exec console \"file $binfile\"" \
  {~"Reading symbols from .*mi-cli...\\n".*} \
  "-interpreter-exec console \"file \$binfile\""

mi_run_to_main

set line_main_head    [gdb_get_line_number "main ("]
set line_main_body    [expr $line_main_head + 2]
set line_main_hello   [gdb_get_line_number "Hello, World!"]
set line_main_return  [expr $line_main_hello + 2]
set line_main_callme_2 [expr $line_main_return + 1]
set line_callee4_head [gdb_get_line_number "callee4 ("]
set line_callee4_body [expr $line_callee4_head + 2]
set line_callee4_next [expr $line_callee4_body + 1]
set line_callee4_next_step [expr $line_callee4_next + 3]

mi_gdb_test "-interpreter-exec console \"set args foobar\"" \
  ".*=cmd-param-changed,param=\"args\",value=\"foobar\".*\\^done" \
  "-interpreter-exec console \"set args foobar\""

mi_gdb_test "-interpreter-exec console \"show args\"" \
  {\~"Argument list to give program being debugged when it is started is \\\"foobar\\\"\.\\n".*\^done} \
  "-interpreter-exec console \"show args\""

mi_gdb_test "-interpreter-exec console \"break callee4\"" \
    {(&.*)*.*~"Breakpoint 2 at.*\\n".*=breakpoint-created,bkpt=\{number="2",type="breakpoint".*\}.*\n\^done} \
    "-interpreter-exec console \"break callee4\""

mi_gdb_test "-interpreter-exec console \"info break\"" \
  {\~"Num[ \t]*Type[ \t]*Disp[ \t]*Enb[ \t]*Address[ \t]*What\\n".*~"2[ \t]*breakpoint[ \t]*keep[ \t]*y[ \t]*0x[0-9A-Fa-f]+[ \t]*in callee4 at .*basics.c:[0-9]+\\n".*\^done} \
  "-interpreter-exec console \"info break\""

mi_gdb_test "-interpreter-exec console \"set listsize 1\"" \
  ".*=cmd-param-changed,param=\"listsize\",value=\"1\".*\\^done" \
  "-interpreter-exec console \"set listsize 1\""

# {.*\~"32[ \t(\\t)]*callee1.*\\n".*\^done }
mi_gdb_test "-interpreter-exec console \"list\"" \
  ".*\~\"$line_main_body\[\\\\t \]*callee1.*;\\\\n\".*\\^done" \
  "-interpreter-exec console \"list\""

mi_execute_to "exec-continue" "breakpoint-hit" "callee4" "" ".*basics.c" $line_callee4_body \
    { "" "disp=\"keep\"" } \
    "continue to callee4"

mi_gdb_test "100-interpreter-exec console \"delete 2\"" \
    {.*=breakpoint-deleted,id=\"2\".*\^done} \
    "-interpreter-exec console \"delete 2\""

# NOTE: cagney/2003-02-03: Not yet.
# mi_gdb_test "200-interpreter-exec console \"up\"" \
#   {.*=selected-frame-level-changed,level="1".*\^done} \
#   "-interpreter-exec console \"up\""
mi_gdb_test "200-interpreter-exec console \"up\"" \
  {~"#.*".*200\^done} \
  "-interpreter-exec console \"up\""

# NOTE: cagney/2003-02-03: Not yet.
# mi_gdb_test "300-interpreter-exec console \"down\"" \
#   {.*=selected-frame-level-changed,level="0".*\^done} \
#   "-interpreter-exec console \"down\""
mi_gdb_test "300-interpreter-exec console \"down\"" \
  {~"#.*".*300\^done} \
  "-interpreter-exec console \"down\""

# NOTE: cagney/2003-02-03: Not yet.
# mi_gdb_test "-interpreter-exec console \"frame 2\"" \
#   {.*=selected-frame-level-changed,level="2".*\^done} \
#   "-interpreter-exec console \"frame 2\""
mi_gdb_test "400-interpreter-exec console \"frame 2\"" \
  {~"#.*".*400\^done} \
  "-interpreter-exec console \"frame 2\""

# NOTE: cagney/2003-02-03: Not yet.
# mi_gdb_test "-stack-select-frame 0" \
#   {.*=selected-frame-level-changed,level="0".*\^done} \
#   "-stack-select-frame 0"
mi_gdb_test "500-stack-select-frame 0" \
  {500\^done} \
  "-stack-select-frame 0"

mi_execute_to "interpreter-exec console step" "end-stepping-range" "callee4" "" ".*basics.c" $line_callee4_next \
    "" "check *stopped from CLI command"

mi_send_resuming_command "exec-step" "-exec-step to line \$line_callee4_next_step"

# Test that the new current source line is _not_ output, given we
# executed MI's -exec-next, not CLI's 'next' command.

set output [mi_gdb_expect_cli_output "\\*stopped" "collect CLI output for -exec-step"]

set test "-exec-step does not produce CLI step output"
if {[regexp "A + B" "$output"]} {
    fail $test
} else {
    pass $test
}

mi_expect_stop "end-stepping-range" "callee4" "" ".*basics.c" $line_callee4_next_step \
    "" "check *stopped from CLI command 2"

# Test that CLI's "finish" command prints the function's return value
# to both the CLI and MI streams, and that the same result variable is
# printed to both streams.
with_test_prefix "CLI finish" {
    mi_send_resuming_command "interpreter-exec console finish" "send CLI command"

    set output [mi_gdb_expect_cli_output "\\*stopped" "collect CLI output"]
    gdb_assert {[regexp \
		     "callee3 .* at .*basics.c:.*.*Value returned is .1 = 0\\\\n" \
		     $output]} \
	"check CLI output"

    mi_expect_stop "function-finished" "callee3" ".*" \
	".*basics.c" ".*" \
	",gdb-result-var=\".1\",return-value=\"0\"" \
	"check MI output"
}

mi_gdb_test "600-break-insert -t basics.c:$line_main_hello" \
	{600\^done,bkpt=.number="3",type="breakpoint".*\}} \
	"-break-insert -t basics.c:\$line_main_hello"

# Test that breakpoint events are always mirrored to the CLI output
# stream (both sync and async modes).
mi_send_resuming_command "exec-continue" "-exec-continue to line \$line_main_hello"

set output [mi_gdb_expect_cli_output "\\*stopped" "collect CLI output for breakpoint hit"]
set test "breakpoint hit produces CLI output"
set pattern "\\\\nTemporary breakpoint 3, main \\(\\) at \[^\n\]*basics.c:$line_main_hello\\\\n\[^\n\]+Hello"

if {[regexp $pattern $output]} {
    pass $test
} else {
    fail $test
}

# Test the MI output.
mi_expect_stop "breakpoint-hit" "main" "" ".*basics.c" \
    $line_main_hello { "" "disp=\"del\"" } "temporary breakpoint output hit in MI"

# Test that the token is output even for CLI commands
# Also test that *stopped includes frame information.
mi_gdb_test "34 next" \
    ".*34\\\^running.*\\*running,thread-id=\"all\"" \
    "34 next: run"

# Test that the new current source line is output to the console
# stream, given we executed the console 'next' command, not
# -exec-next.
set test "34 next: CLI output"
gdb_expect {
    -re "~\"$line_main_return\[^\r\n\]+\r\n" {
	pass $test
    }
    timeout {
	fail "$test (timeout)"
    }
}

mi_expect_stop "end-stepping-range" "main" "" ".*basics.c" $line_main_return "" \
    "34 next: stop"

mi_gdb_test "-interpreter-exec console \"list\"" \
  "\~\"$line_main_return\[\\\\t ]*callme \\(1\\);\\\\n\".*\\^done" \
  "-interpreter-exec console \"list\" at basics.c:\$line_main_return"

mi_gdb_test "600-break-insert -t basics.c:$line_main_callme_2" \
	{600\^done,bkpt=.number="4",type="breakpoint".*\}} \
	"-break-insert -t basics.c:\$line_main_callme_2"

mi_execute_to "exec-continue" "breakpoint-hit" "main" "" ".*basics.c" \
    $line_main_callme_2 { "" "disp=\"del\"" } \
    "-exec-continue to line \$line_main_callme_2"

# Restore the listsize back to the default.
mi_gdb_test "-interpreter-exec console \"set listsize 10\"" \
  ".*=cmd-param-changed,param=\"listsize\",value=\"10\".*\\^done" \
  "-interpreter-exec console \"set listsize 10\""

# "list" should show 10 lines centered on where the program stopped.
set first_list_line [expr $line_main_callme_2 - 5]
mi_gdb_test "-interpreter-exec console \"list\"" \
    ".*\~\"$first_list_line.*\\^done" \
    "-interpreter-exec console \"list\" at basics.c:\$line_main_callme_2"

mi_gdb_test "-interpreter-exec console \"help set args\"" \
  {\~"Set argument list to give program being debugged when it is started\.\\nFollow this command with any number of args, to be passed to the program\.".*\^done} \
  "-interpreter-exec console \"help set args\""

# NOTE: cagney/2003-02-03: Not yet.
# mi_gdb_test "-interpreter-exec console \"set \$pc=0x0\"" \
#   {.*=target-changed.*\^done} \
#   "-interpreter-exec console \"set \$pc=0x0\""
mi_gdb_test "888-interpreter-exec console \"set \$pc=0x0\"" \
  {888\^done} \
  "-interpreter-exec console \"set \$pc=0x0\""

#mi_gdb_test "-interpreter-exec console \"\"" \
  {} \
  "-interpreter-exec console \"\""

mi_gdb_exit
return 0