]>
Commit | Line | Data |
---|---|---|
1d506c26 | 1 | # Copyright 2017-2024 Free Software Foundation, Inc. |
a0922d80 PA |
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 | # Set a breakpoint with a "continue" command attached, let the | |
17 | # inferior hit the breakpoint continuously. Check that we can use ^C | |
18 | # to interrupt the command, and that if ^C is pressed while GDB has | |
19 | # the terminal (between the stop and the re-resume), the resulting | |
20 | # "Quit" doesn't mess up the debug session. | |
21 | ||
450d26c8 | 22 | require {!target_info exists gdb,nosignals} |
a0922d80 PA |
23 | |
24 | # This test requires sending ^C to interrupt the running target. | |
450d26c8 | 25 | require {!target_info exists gdb,nointerrupts} |
a0922d80 PA |
26 | |
27 | standard_testfile | |
28 | ||
98bf5c02 | 29 | if {[build_executable "failed to prepare" $testfile $srcfile debug]} { |
a0922d80 PA |
30 | return -1 |
31 | } | |
32 | ||
33 | # See intro. | |
34 | ||
35 | proc do_test {} { | |
36 | global srcfile binfile | |
37 | global gdb_prompt | |
38 | ||
39 | gdb_test "break foo" "Breakpoint .*" "set breakpoint" | |
40 | ||
41 | gdb_test \ | |
42 | [multi_line_input \ | |
43 | {commands} \ | |
44 | { c} \ | |
45 | {end}] \ | |
46 | "" "commands" | |
47 | ||
48 | set test "stop with control-c" | |
49 | ||
50 | for {set iter 0} {$iter < 20} {incr iter} { | |
51 | ||
52 | # Useful for debugging. | |
53 | #send_user "iter: $iter\n" | |
54 | ||
55 | # Consume one breakpoint hit (at least), to make sure that the | |
56 | # continue actually continues between attempts, as opposed to | |
57 | # "c" not actually resuming and then Ctrl-C managing to | |
58 | # interrupt anyway. | |
59 | if {[gdb_test_multiple "continue" "$test (continue)" { | |
60 | -re "Continuing.*Breakpoint \[^\r\n\]*\r\n" { | |
61 | } | |
62 | }] != 0} { | |
63 | return | |
64 | } | |
65 | ||
66 | set internal_pass "IPASS: $test (iter $iter)" | |
67 | ||
68 | # Breakpoint commands run after the target is considered | |
69 | # stopped, and thus run with GDB owning the terminal. That | |
70 | # means that it is expected that a Ctrl-C that arrives between | |
71 | # - GDB reporting the breakpoint hit, and, | |
72 | # - the breakpoint command continuing the target | |
73 | # results in a Quit. | |
74 | ||
75 | after 200 {send_gdb "\003"} | |
76 | if {[gdb_test_multiple "" "$test (unexpected)" { | |
77 | -re "Program terminated with signal SIGALRM.*\r\n$gdb_prompt $" { | |
78 | fail "$test (SIGALRM)" | |
79 | return | |
80 | } | |
81 | -re "Program received signal SIGINT.*\r\n$gdb_prompt $" { | |
82 | send_log "$internal_pass (SIGINT)\n" | |
83 | } | |
84 | -re "Quit\r\n$gdb_prompt $" { | |
85 | send_log "$internal_pass (Quit)\n" | |
980548fd PA |
86 | |
87 | # Check that if we managed to quit somewhere deep in | |
88 | # the unwinders, we can still unwind again. | |
89 | set ok 0 | |
90 | gdb_test_multiple "bt" "$internal_pass (bt)" { | |
91 | -re "#0.*$gdb_prompt $" { | |
92 | send_log "$internal_pass (bt)\n" | |
93 | set ok 1 | |
94 | } | |
95 | } | |
96 | if {!$ok} { | |
97 | return | |
98 | } | |
a0922d80 PA |
99 | } |
100 | -re "Quit\r\n\r\nCommand aborted.\r\n$gdb_prompt $" { | |
101 | send_log "$internal_pass (Command aborted)\n" | |
102 | } | |
103 | -re "Breakpoint \[^\r\n\]*$srcfile" { | |
104 | exp_continue | |
105 | } | |
106 | }] != 0} { | |
107 | break | |
108 | } | |
109 | } | |
110 | ||
111 | gdb_assert {$iter == 20} "stop with control-c" | |
112 | } | |
113 | ||
114 | # With native debugging and "run" (with job control), if the inferior | |
115 | # is running, the Ctrl-C reaches the inferior directly, not GDB. With | |
116 | # native debugging and "attach", or with remote debugging, the Ctrl-C | |
117 | # reaches GDB first. So for completeness, try both "run" and | |
118 | # "attach". | |
119 | ||
120 | with_test_prefix "run" { | |
121 | clean_restart $binfile | |
122 | ||
123 | if {![runto_main]} { | |
124 | return -1 | |
125 | } | |
126 | ||
127 | do_test | |
128 | } | |
129 | ||
130 | with_test_prefix "attach" { | |
131 | if {[can_spawn_for_attach]} { | |
132 | clean_restart $binfile | |
133 | ||
134 | set test_spawn_id [spawn_wait_for_attach $binfile] | |
135 | set testpid [spawn_id_get_pid $test_spawn_id] | |
136 | ||
137 | gdb_test "attach $testpid" "Attaching to.*process $testpid.*" "attach" | |
138 | ||
139 | do_test | |
140 | ||
141 | kill_wait_spawned_process $test_spawn_id | |
142 | } | |
143 | } |