Commit | Line | Data |
---|---|---|
b811d2c2 | 1 | # Copyright 2009-2020 Free Software Foundation, Inc. |
4c2f2a79 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 | standard_testfile | |
17 | ||
18 | if { [build_executable ${testfile}.exp "${testfile}" $srcfile {debug nowarnings}] } { | |
19 | return -1 | |
20 | } | |
21 | ||
22 | # Define the hook-stop that runs COMMANDS. | |
23 | ||
24 | proc define_hook_stop {commands} { | |
25 | set test "define hook-stop command" | |
26 | gdb_test_multiple "define hook-stop" "$test" { | |
27 | -re "Type commands for definition of \"hook-stop\".\r\nEnd with a line saying just \"end\".\r\n>$" { | |
28 | gdb_test "$commands\nend" "" "$test" | |
29 | } | |
30 | } | |
31 | } | |
32 | ||
33 | # Restart GDB, run to main, set a breakpoint, and define a hook-stop | |
34 | # that runs COMMANDS. If running to main fails, this returns to the | |
35 | # caller's caller directly. | |
36 | ||
37 | proc setup {commands} { | |
38 | global srcfile binfile | |
39 | ||
40 | clean_restart $binfile | |
41 | ||
42 | if ![runto_main] then { | |
bc6c7af4 | 43 | fail "can't run to main" |
4c2f2a79 PA |
44 | return -code return |
45 | } | |
46 | ||
47 | gdb_test "break func" \ | |
48 | "Breakpoint.*at.* file .*$srcfile.*\\." \ | |
49 | "breakpoint line number" | |
50 | ||
51 | define_hook_stop $commands | |
52 | } | |
53 | ||
54 | # Check that the hook-stop runs before the frame is printed. | |
55 | ||
56 | proc hook_stop_before_frame {} { | |
57 | with_test_prefix "hook-stop runs before frame print" { | |
58 | global gdb_prompt | |
59 | ||
60 | setup "echo \"Hello.\"" | |
61 | ||
62 | set test "run hook-stop" | |
63 | gdb_test_multiple "continue" "$test" { | |
64 | -re "\"Hello\\.\"\r\nBreakpo.*func.*set breakpoint here.*${gdb_prompt} $" { | |
65 | pass $test | |
66 | } | |
67 | ||
68 | -re "Breakpo.*func.*set breakpoint here.*\"Hello\\.\".*${gdb_prompt} $" { | |
69 | fail $test | |
70 | } | |
71 | } | |
72 | } | |
73 | } | |
74 | ||
75 | # Check that GDB gracefully handles the case of the inferior dying | |
76 | # while running the hook-stop. | |
77 | ||
78 | proc hook_stop_kill {} { | |
79 | with_test_prefix "hook-stop kills inferior" { | |
80 | global gdb_prompt | |
f67c0c91 | 81 | global decimal |
4c2f2a79 PA |
82 | |
83 | setup "kill" | |
84 | ||
85 | gdb_test_no_output "set confirm off" | |
86 | ||
87 | set test "run hook-stop" | |
88 | gdb_test_multiple "continue" "$test" { | |
249b5733 | 89 | -re "Continuing.\r\n\\\[Inferior $decimal \\(.*\\) killed\\\]\r\n${gdb_prompt} $" { |
4c2f2a79 PA |
90 | pass $test |
91 | } | |
92 | } | |
93 | ||
94 | gdb_test "info threads" "No threads.*" | |
95 | } | |
96 | } | |
97 | ||
98 | # Check that GDB gracefully handles the case of the hook-stop | |
99 | # continuing the inferior in the foreground. | |
100 | ||
101 | proc hook_stop_continue_fg {} { | |
102 | with_test_prefix "hook-stop runs continue" { | |
103 | global gdb_prompt | |
104 | ||
105 | setup "if \$do_continue\nset \$do_continue = 0\ncontinue\nend" | |
106 | ||
107 | gdb_test "print \$do_continue = 1" " = 1" | |
108 | ||
109 | gdb_test "next" "Breakpoint.*func \\(\\) at .*set breakpoint here \\*/" \ | |
110 | "next triggering hook-stop" | |
111 | ||
112 | gdb_test "next" "a = 2;" "next no hook-stop" | |
113 | } | |
114 | } | |
115 | ||
116 | # Check that GDB gracefully handles the case of the hook-stop | |
117 | # continuing the inferior in the background. | |
118 | ||
119 | proc hook_stop_continue_bg {} { | |
120 | with_test_prefix "hook-stop runs continue&" { | |
121 | global gdb_prompt | |
122 | ||
123 | setup "if \$do_continue\nset \$do_continue = 0\ncontinue&\nend" | |
124 | ||
125 | gdb_test "print \$do_continue = 1" " = 1" | |
126 | ||
127 | set test "run hook-stop" | |
128 | gdb_test_multiple "continue" "$test" { | |
129 | -re "Continuing.\r\n.*${gdb_prompt} " { | |
130 | pass $test | |
131 | } | |
132 | } | |
133 | ||
134 | set test "inferior exits normally" | |
135 | gdb_test_multiple "" "$test" { | |
136 | -re "exited normally" { | |
137 | pass $test | |
138 | } | |
139 | } | |
140 | gdb_test "info threads" "No threads.*" | |
141 | } | |
142 | } | |
143 | ||
144 | # Check that GDB gracefully handles the case of the hook-stop running | |
145 | # "next". GDB used to print the stop event twice. | |
146 | ||
147 | proc hook_stop_next {} { | |
148 | with_test_prefix "hook-stop runs next" { | |
149 | global gdb_prompt | |
150 | ||
151 | setup "next" | |
152 | ||
153 | set test "run hook-stop" | |
154 | gdb_test_multiple "continue" "$test" { | |
155 | -re "a = 2.*a = 2${gdb_prompt} $" { | |
156 | fail $test | |
157 | } | |
158 | -re "a = 2.*${gdb_prompt} $" { | |
159 | pass $test | |
160 | } | |
161 | } | |
162 | } | |
163 | } | |
164 | ||
165 | hook_stop_before_frame | |
166 | hook_stop_kill | |
167 | hook_stop_continue_fg | |
168 | hook_stop_continue_bg | |
169 | hook_stop_next |