annota3.exp revision 1.1.1.7 1 1.1.1.7 christos # Copyright 2003-2023 Free Software Foundation, Inc.
2 1.1 christos
3 1.1 christos # This program is free software; you can redistribute it and/or modify
4 1.1 christos # it under the terms of the GNU General Public License as published by
5 1.1 christos # the Free Software Foundation; either version 3 of the License, or
6 1.1 christos # (at your option) any later version.
7 1.1 christos #
8 1.1 christos # This program is distributed in the hope that it will be useful,
9 1.1 christos # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 1.1 christos # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 1.1 christos # GNU General Public License for more details.
12 1.1 christos #
13 1.1 christos # You should have received a copy of the GNU General Public License
14 1.1 christos # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 1.1 christos
16 1.1 christos # This file was written by Elena Zannoni (ezannoni (at) cygnus.com)
17 1.1 christos
18 1.1 christos
19 1.1.1.5 christos # This testcase cannot use runto_main because of the different prompt
20 1.1.1.5 christos # we get when using annotation level 2.
21 1.1 christos #
22 1.1.1.5 christos if ![target_can_use_run_cmd] {
23 1.1 christos return 0
24 1.1 christos }
25 1.1 christos
26 1.1 christos
27 1.1 christos #
28 1.1 christos # test running programs
29 1.1 christos #
30 1.1 christos
31 1.1 christos standard_testfile .c
32 1.1 christos
33 1.1 christos if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } {
34 1.1.1.4 christos untested "failed to compile"
35 1.1 christos return -1
36 1.1 christos }
37 1.1 christos
38 1.1 christos
39 1.1 christos clean_restart ${binfile}
40 1.1 christos
41 1.1 christos # The commands we test here produce many lines of output; disable "press
42 1.1 christos # <return> to continue" prompts.
43 1.1 christos gdb_test_no_output "set height 0"
44 1.1 christos
45 1.1 christos #
46 1.1.1.3 christos # break in main
47 1.1 christos #
48 1.1 christos
49 1.1 christos set main_line [gdb_get_line_number "break main"]
50 1.1 christos
51 1.1.1.3 christos gdb_test "break ${srcfile}:${main_line}" \
52 1.1 christos "Breakpoint.*at.* file .*$srcfile, line $main_line\\." \
53 1.1 christos "breakpoint main"
54 1.1 christos
55 1.1 christos
56 1.1 christos # NOTE: this prompt is OK only when the annotation level is > 1
57 1.1 christos
58 1.1 christos # NOTE: When this prompt is in use the gdb_test procedure cannot be
59 1.1 christos # used because it assumes that the last char after the gdb_prompt is a
60 1.1 christos # white space. This is not true with this annotated prompt. So we must
61 1.1 christos # use send_gdb and gdb_expect or gdb_expect_list.
62 1.1 christos
63 1.1 christos set old_gdb_prompt $gdb_prompt
64 1.1 christos set gdb_prompt "\r\n\032\032pre-prompt\r\n$gdb_prompt \r\n\032\032prompt\r\n"
65 1.1 christos
66 1.1 christos
67 1.1 christos
68 1.1 christos #
69 1.1 christos # set the annotation level to 3
70 1.1 christos #
71 1.1 christos # of course, this will test:
72 1.1 christos # annotate-pre-prompt
73 1.1 christos # annotate-prompt
74 1.1 christos # annotate-post-prompt (in the next block)
75 1.1 christos #
76 1.1 christos send_gdb "set annotate 3\n"
77 1.1 christos gdb_expect_list "annotation set at level 3" "\r\n$gdb_prompt$" {
78 1.1 christos "set annotate 3"
79 1.1 christos }
80 1.1 christos
81 1.1 christos #
82 1.1 christos # if construct:
83 1.1 christos #
84 1.1 christos gdb_test_multiple "if 1" "start if construct" {
85 1.1 christos -re "^if 1\r\n\r\n\032\032post-prompt\r\n\r\n\032\032pre-commands\r\n >\r\n\032\032commands\r\n$" {
86 1.1 christos pass "start if construct"
87 1.1 christos }
88 1.1 christos }
89 1.1 christos
90 1.1 christos gdb_test_multiple "end" "end if construct" {
91 1.1 christos -re "^end\r\n\r\n\032\032post-commands\r\n$gdb_prompt$" {
92 1.1 christos pass "end if construct"
93 1.1 christos }
94 1.1 christos }
95 1.1 christos
96 1.1 christos #
97 1.1 christos # info break:
98 1.1 christos #
99 1.1 christos send_gdb "info break\n"
100 1.1 christos gdb_expect_list "breakpoint info" "$gdb_prompt$" [concat {
101 1.1 christos "\r\n\032\032post-prompt\r\n"
102 1.1 christos "Num Type Disp Enb Address +What\r\n" } [list \
103 1.1 christos "1 breakpoint keep y 0x\[0-9a-zA-Z\]+ +in main at .*annota3.c:$main_line\r\n"]]
104 1.1 christos
105 1.1 christos
106 1.1 christos #
107 1.1 christos # run to a break point will test:
108 1.1 christos #
109 1.1 christos #exp_internal 1
110 1.1 christos send_gdb "run\n"
111 1.1 christos gdb_expect_list "run until main breakpoint" "$gdb_prompt$" [concat {
112 1.1 christos "\r\n\032\032post-prompt\r\n"
113 1.1 christos "Starting program: .*annota3(|\.exe) \r\n"
114 1.1 christos "\r\n\032\032starting\r\n"
115 1.1 christos "\r\n\032\032breakpoint 1\r\n"
116 1.1 christos "\r\n"
117 1.1 christos "Breakpoint 1, "
118 1.1 christos "\r\n\032\032frame-begin 0 0x\[0-9a-z\]+\r\n" } [list \
119 1.1 christos "main \\(\\) at .*annota3.c:$main_line\r\n"] [list \
120 1.1 christos "\r\n\032\032source.*annota3.c:$main_line:.*:beg:0x\[0-9a-z\]+\r\n"] {
121 1.1 christos "\r\n\032\032stopped\r\n"
122 1.1 christos }]
123 1.1 christos #exp_internal 0
124 1.1 christos #exit 0
125 1.1 christos
126 1.1 christos #
127 1.1 christos # Let's do a next, to get to a point where the array is initialized
128 1.1 christos # We don't care about the annotated output for this operation, it is the same as
129 1.1 christos # the one produced by run above
130 1.1 christos #
131 1.1 christos send_gdb "next\n"
132 1.1 christos gdb_expect_list "go after array init line" "$gdb_prompt$" {
133 1.1 christos "\r\n\032\032post-prompt\r\n"
134 1.1 christos "\r\n\032\032starting\r\n"
135 1.1 christos "\r\n\032\032source .*annota3.c:\[0-9\]+:\[0-9\]+:beg:0x\[0-9a-z\]+\r\n"
136 1.1 christos "\r\n\032\032stopped\r\n"
137 1.1 christos }
138 1.1 christos
139 1.1 christos
140 1.1 christos #
141 1.1 christos # printing the array:
142 1.1 christos #
143 1.1 christos send_gdb "print my_array\n"
144 1.1 christos gdb_expect_list "print array" "$gdb_prompt$" {
145 1.1 christos "\r\n\032\032post-prompt\r\n"
146 1.1 christos ".*= .1, 2, 3.\r\n"
147 1.1 christos }
148 1.1 christos
149 1.1 christos
150 1.1 christos #
151 1.1 christos # this should generate an error message, so to test:
152 1.1 christos # annotate-error-begin
153 1.1 christos # FIXME: annotate-error not tested
154 1.1 christos #
155 1.1 christos
156 1.1 christos #exp_internal 1
157 1.1 christos send_gdb "print non_existent_value\n"
158 1.1 christos gdb_expect_list "print non_existent_value" "$gdb_prompt$" {
159 1.1 christos "\r\n\032\032post-prompt\r\n"
160 1.1 christos "\r\n\032\032error-begin\r\n"
161 1.1 christos "No symbol \"non_existent_value\" in current context.\r\n"
162 1.1 christos "\r\n\032\032error\r\n"
163 1.1 christos }
164 1.1 christos
165 1.1 christos
166 1.1 christos #
167 1.1 christos # break at signal handler
168 1.1 christos #
169 1.1 christos send_gdb "break handle_USR1\n"
170 1.1 christos gdb_expect_list "breakpoint handle_USR1" "$gdb_prompt$" {
171 1.1 christos "\r\n\032\032post-prompt\r\n"
172 1.1 christos "Breakpoint.*at 0x\[0-9a-z\]+: file.*annota3.c, line.*\r\n"
173 1.1 christos }
174 1.1 christos
175 1.1 christos #
176 1.1 christos # break at printf. When we are stopped at printf, we can test
177 1.1 christos #
178 1.1 christos send_gdb "break printf\n"
179 1.1 christos gdb_expect_list "breakpoint printf" "$gdb_prompt$" {
180 1.1 christos "\r\n\032\032post-prompt\r\n"
181 1.1 christos "Breakpoint.*at 0x\[0-9a-z\]+.*"
182 1.1 christos }
183 1.1 christos
184 1.1 christos #
185 1.1 christos # get to printf
186 1.1 christos #
187 1.1 christos send_gdb "continue\n"
188 1.1 christos gdb_expect_list "continue to printf" "$gdb_prompt$" {
189 1.1 christos "\r\n\032\032post-prompt\r\n"
190 1.1 christos "Continuing.\r\n"
191 1.1 christos "\r\n\032\032starting\r\n"
192 1.1 christos "\r\n\032\032breakpoint 3\r\n"
193 1.1 christos "\r\n"
194 1.1 christos "Breakpoint 3, \[^\r\n\]*\r\n"
195 1.1 christos "\r\n\032\032stopped\r\n"
196 1.1 christos }
197 1.1 christos
198 1.1 christos send_gdb "backtrace\n"
199 1.1 christos gdb_expect_list "backtrace from shlibrary" "$gdb_prompt$" {
200 1.1 christos "\r\n\032\032post-prompt\r\n"
201 1.1 christos "#0 .* .*printf(@\[^ ]*)? \[^\r\n\]*\r\n"
202 1.1 christos "#1 .* main \[^\r\n\]*\r\n"
203 1.1 christos }
204 1.1 christos
205 1.1 christos
206 1.1 christos #
207 1.1 christos # test printing a frame with some arguments:
208 1.1 christos #
209 1.1 christos
210 1.1 christos if [target_info exists gdb,nosignals] {
211 1.1 christos unsupported "send SIGUSR1"
212 1.1 christos unsupported "backtrace @ signal handler"
213 1.1 christos } else {
214 1.1 christos send_gdb "signal SIGUSR1\n"
215 1.1 christos gdb_expect_list "send SIGUSR1" "$gdb_prompt$" {
216 1.1 christos "\r\n\032\032post-prompt\r\n"
217 1.1 christos "Continuing with signal SIGUSR1.\r\n"
218 1.1 christos "\r\n\032\032starting\r\n"
219 1.1 christos "\r\n\032\032breakpoint 2\r\n"
220 1.1 christos "\r\n"
221 1.1 christos "Breakpoint 2, "
222 1.1 christos "\r\n\032\032frame-begin 0 0x\[0-9a-z\]+\r\n"
223 1.1 christos "handle_USR1 \\(sig=\[0-9\]+\\) at .*annota3.c:\[0-9\]+\r\n"
224 1.1 christos "\r\n\032\032source .*annota3.c:\[0-9\]+:\[0-9\]+:beg:0x\[0-9a-z\]+\r\n"
225 1.1 christos "\r\n\032\032stopped\r\n"
226 1.1 christos }
227 1.1 christos
228 1.1 christos #
229 1.1 christos # test:
230 1.1 christos #
231 1.1 christos send_gdb "backtrace\n"
232 1.1 christos gdb_expect_list "backtrace @ signal handler" "$gdb_prompt$" {
233 1.1 christos "#0 +handle_USR1 \[^\r\n\]+\r\n"
234 1.1 christos "#1 +.signal handler called.\r\n"
235 1.1 christos "#2 .* .*printf(@\[^ \]*)? \[^\r\n\]+\r\n"
236 1.1 christos "#3 .* main \[^\r\n\]+\r\n"
237 1.1 christos }
238 1.1 christos }
239 1.1 christos
240 1.1 christos #
241 1.1 christos # delete all the breakpoints
242 1.1 christos #
243 1.1 christos send_gdb "delete 1\n"
244 1.1 christos gdb_expect_list "delete bp 1" "$gdb_prompt$" {
245 1.1 christos "\r\n\032\032post-prompt\r\n"
246 1.1 christos }
247 1.1 christos
248 1.1 christos send_gdb "delete 2\n"
249 1.1 christos gdb_expect_list "delete bp 2" "$gdb_prompt$" {
250 1.1 christos "\r\n\032\032post-prompt\r\n"
251 1.1 christos }
252 1.1 christos
253 1.1 christos send_gdb "delete 3\n"
254 1.1 christos gdb_expect_list "delete bp 3" "$gdb_prompt$" {
255 1.1 christos "\r\n\032\032post-prompt\r\n"
256 1.1 christos }
257 1.1 christos
258 1.1 christos #
259 1.1.1.3 christos # break in main, after value is initialized. This is in preparation
260 1.1 christos # to test the annotate output for the display command.
261 1.1 christos #
262 1.1.1.3 christos send_gdb "break ${srcfile}:${main_line}\n"
263 1.1.1.3 christos gdb_expect_list "break in main" "$gdb_prompt$" [concat {
264 1.1 christos "\r\n\032\032post-prompt\r\n" } [list \
265 1.1 christos "Breakpoint 4 at 0x\[0-9a-z\]+: file .*annota3.c, line $main_line.\r\n"]]
266 1.1 christos
267 1.1 christos #
268 1.1 christos # display the value
269 1.1 christos #
270 1.1 christos send_gdb "display value\n"
271 1.1 christos gdb_expect_list "set up display" "$gdb_prompt$" {
272 1.1 christos "\r\n\032\032post-prompt\r\n"
273 1.1 christos "1: value = 7\r\n"
274 1.1 christos }
275 1.1 christos
276 1.1.1.7 christos # Get the core into the output directory.
277 1.1.1.7 christos if {![is_remote host]} {
278 1.1.1.7 christos gdb_test -prompt "$gdb_prompt$" \
279 1.1.1.7 christos "set cwd [file dirname $binfile]" "" \
280 1.1.1.7 christos "set inferior cwd to test directory"
281 1.1.1.7 christos }
282 1.1 christos
283 1.1 christos # should ask query. Test annotate-query.
284 1.1 christos # we don't care about anything else here, only the query.
285 1.1 christos
286 1.1 christos send_gdb "run\n"
287 1.1 christos gdb_expect {
288 1.1 christos -re "pre-query.*already.*\\(y or n\\).*query\r\n" {
289 1.1 christos send_gdb "y\n"
290 1.1 christos gdb_expect {
291 1.1 christos -re ".*post-query.*$gdb_prompt$" \
292 1.1 christos { pass "re-run" }
293 1.1 christos -re ".*$gdb_prompt$" { fail "re-run" }
294 1.1 christos timeout { fail "re-run (timeout)" }
295 1.1 christos }
296 1.1 christos }
297 1.1 christos -re ".*$gdb_prompt$" { fail "re-run" }
298 1.1 christos timeout { fail "re-run (timeout)" }
299 1.1 christos }
300 1.1 christos
301 1.1 christos #
302 1.1 christos # Test that breakpoints-invalid is issued once and only once for
303 1.1 christos # breakpoint ignore count changes, after annotation stopped.
304 1.1 christos # NOTE: breakpoints-invalid annotations have been removed from
305 1.1 christos # level 3 but keep these tests for continuity and comparison
306 1.1 christos # with annota1.exp.
307 1.1 christos
308 1.1 christos set value_inc_line [gdb_get_line_number "increment value"]
309 1.1 christos
310 1.1 christos send_gdb "break $value_inc_line\n"
311 1.1 christos gdb_expect_list "break at value++" "$gdb_prompt$" [concat {
312 1.1 christos "\r\n\032\032post-prompt\r\n" } [list \
313 1.1 christos "Breakpoint 5 at 0x\[0-9a-z\]+: file .*annota3.c, line $value_inc_line.\r\n"]]
314 1.1 christos
315 1.1 christos send_gdb "ignore 5 4\n"
316 1.1 christos gdb_expect_list "ignore 5 4" "$gdb_prompt$" {
317 1.1 christos "\r\n\032\032post-prompt\r\n"
318 1.1 christos "Will ignore next 4 crossings of breakpoint 5"
319 1.1 christos "\r\n"
320 1.1 christos }
321 1.1 christos
322 1.1 christos send_gdb "continue\n"
323 1.1 christos gdb_expect_list "annotate ignore count change" "$gdb_prompt$" [concat {
324 1.1 christos "\r\n\032\032post-prompt\r\n"
325 1.1 christos "\r\n\032\032breakpoint 5\r\n"
326 1.1 christos "\r\n"
327 1.1 christos "Breakpoint 5, "
328 1.1 christos "\r\n\032\032frame-begin 0 0x\[0-9a-z\]+\r\n" } [list \
329 1.1 christos "main \\(\\) at .*annota3.c:$value_inc_line\r\n"] [list \
330 1.1 christos "\r\n\032\032source .*annota3.c:$value_inc_line:\[0-9\]+:beg:0x\[0-9a-z\]+\r\n"] {
331 1.1 christos "1: value = 11\r\n"
332 1.1 christos "\r\n\032\032stopped\r\n"
333 1.1 christos }]
334 1.1 christos
335 1.1 christos # check that ignore command is working, or the above can provide
336 1.1 christos # misleading assurance ...
337 1.1 christos
338 1.1 christos send_gdb "next\n"
339 1.1 christos gdb_expect_list "next to exit loop" "$gdb_prompt$" {
340 1.1 christos "\r\n\032\032post-prompt\r\n"
341 1.1 christos "\r\n\032\032starting\r\n"
342 1.1 christos "\r\n\032\032source.*annota3.c:\[0-9\]+:\[0-9\]+:beg:0x\[0-9a-z\]+\r\n"
343 1.1 christos "1: value = 12\r\n"
344 1.1 christos "\r\n\032\032stopped\r\n"
345 1.1 christos }
346 1.1 christos
347 1.1 christos set after_loop_line [gdb_get_line_number "after loop"]
348 1.1 christos
349 1.1 christos send_gdb "next\n"
350 1.1 christos gdb_expect_list "breakpoint ignore count" "$gdb_prompt$" [concat {
351 1.1 christos "\r\n\032\032post-prompt\r\n"
352 1.1 christos "\r\n\032\032starting\r\n" } [list \
353 1.1 christos "\r\n\032\032source.*annota3.c:$after_loop_line:\[0-9\]+:beg:0x\[0-9a-z\]+\r\n"] {
354 1.1 christos "1: value = 12\r\n"
355 1.1 christos "\r\n\032\032stopped\r\n"
356 1.1 christos }]
357 1.1 christos
358 1.1 christos # Get the inferior's PID for later.
359 1.1 christos
360 1.1 christos set test "get inferior pid"
361 1.1 christos set pid -1
362 1.1 christos gdb_test_multiple "info inferior 1" "$test" {
363 1.1 christos -re "process (\[0-9\]*).*$gdb_prompt$" {
364 1.1 christos set pid $expect_out(1,string)
365 1.1 christos pass "$test"
366 1.1 christos }
367 1.1 christos }
368 1.1 christos
369 1.1 christos # Send a signal that is not handled
370 1.1 christos
371 1.1 christos if [target_info exists gdb,nosignals] {
372 1.1 christos unsupported "signal sent"
373 1.1 christos } else {
374 1.1 christos send_gdb "signal SIGTRAP\n"
375 1.1 christos gdb_expect_list "signal sent" "$gdb_prompt$" {
376 1.1 christos "\r\n\032\032post-prompt\r\n"
377 1.1 christos "Continuing with signal SIGTRAP.\r\n"
378 1.1 christos "\r\n\032\032starting\r\n"
379 1.1 christos "\r\n\032\032signalled\r\n"
380 1.1 christos "\r\nProgram terminated with signal SIGTRAP, Trace.breakpoint trap.\r\n"
381 1.1 christos "The program no longer exists.\r\n"
382 1.1 christos "\r\n\032\032stopped\r\n"
383 1.1 christos }
384 1.1 christos }
385 1.1 christos
386 1.1 christos
387 1.1 christos # Check for production of a core file and remove it!
388 1.1.1.7 christos remove_core $pid
389 1.1 christos
390 1.1 christos # restore the original prompt for the rest of the testsuite
391 1.1 christos
392 1.1 christos set gdb_prompt $old_gdb_prompt
393