1 # Copyright
1997, 1999 Free Software Foundation
, Inc.
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
2 of the License
, or
6 #
(at your option
) any later version.
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.
13 # You should have received a copy of the GNU General Public License
14 # along with this
program; if not
, write to the Free Software
15 # Foundation
, Inc.
, 59 Temple Place
- Suite
330, Boston
, MA
02111-1307, USA.
*/
17 # Please email
any bugs
, comments
, and
/or additions to this file to
:
18 # bug
-gdb@prep.ai.mit.edu
24 if { ![isnative
] } then {
31 # NOTE drow
/2002-12-06: I don
't know what the referenced kernel problem
32 # is, but it appears to be fixed in recent HP/UX versions.
34 ##if [istarget "hppa2.0w-hp-hpux*"] {
35 ## warning "Don't run gdb.base
/foll
-vfork.exp until JAGaa43495 kernel problem is fixed.
"
39 set testfile
"foll-vfork"
40 set testfile2
"vforked-prog"
41 set srcfile $
{testfile
}.c
42 set srcfile2 $
{testfile2
}.c
43 set binfile $
{objdir
}/$
{subdir
}/$
{testfile
}
44 set binfile2 $
{objdir
}/$
{subdir
}/$
{testfile2
}
46 if { [gdb_compile
"${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
47 gdb_suppress_entire_file
"Testcase compile failed, so all tests in this file will automatically fail."
50 if { [gdb_compile
"${srcdir}/${subdir}/${srcfile2}" "${binfile2}" executable {debug}] != "" } {
51 gdb_suppress_entire_file
"Testcase compile failed, so all tests in this file will automatically fail."
55 # Until
"set follow-fork-mode" and "catch vfork" are implemented on
58 if ![istarget
"hppa*-hp-hpux*"] then {
62 # Test to see
if we are
on an HP
-UX
10.20 and
if so
,
63 #
do not run these tests as catching vfork is disabled
for
66 if [istarget
"hppa*-hp-hpux10.20"] then {
70 # A few of these tests require a little more time than the standard
72 set oldtimeout $timeout
73 set timeout
[expr
"$timeout + 10"]
75 proc vfork_parent_follow_through_step
{} {
78 send_gdb
"set follow parent\n"
80 -re
"$gdb_prompt $" {pass "set follow parent, vfork through step"}
81 timeout
{fail
"set follow parent, vfork through step"}
85 -re
"Detaching after fork from.*13.*$gdb_prompt "\
86 {pass
"vfork parent follow, through step"}
87 -re
"$gdb_prompt $" {fail "vfork parent follow, through step"}
88 timeout
{fail
"(timeout) vfork parent follow, through step" }
90 # The child has been detached
; allow time
for any output it might
91 # generate to arrive
, so that output doesn
't get confused with
92 # any gdb_expected debugger output from a subsequent testpoint.
97 proc vfork_parent_follow_to_bp {} {
100 send_gdb "set follow parent\n"
102 -re "$gdb_prompt $" {pass "set follow parent, vfork to bp"}
103 timeout {fail "set follow parent, vfork to bp"}
105 send_gdb "break 18\n"
107 -re "$gdb_prompt $" {pass "break, vfork to bp"}
108 timeout {fail "break, vfork to bp"}
110 send_gdb "continue\n"
112 -re ".*Detaching after fork from process.*Breakpoint.*18.*$gdb_prompt "\
113 {pass "vfork parent follow, to bp"}
114 -re "$gdb_prompt $" {fail "vfork parent follow, to bp"}
115 timeout {fail "(timeout) vfork parent follow, to bp" }
117 # The child has been detached; allow time for any output it might
118 # generate to arrive, so that output doesn't
get confused with
119 #
any expected debugger output from a subsequent testpoint.
124 proc vfork_and_exec_child_follow_to_main_bp
{} {
128 send_gdb
"set follow child\n"
130 -re
"$gdb_prompt $" {pass "set follow child, vfork and exec to main bp"}
131 timeout
{fail
"set follow child, vfork and exec to main bp"}
133 send_gdb
"continue\n"
135 -re
"Detaching from program.*Attaching after fork to.*Executing new program.*Breakpoint.*vforked-prog.c:9.*$gdb_prompt "\
136 {pass
"vfork and exec child follow, to main bp"}
137 -re
"$gdb_prompt $" {fail "vfork and exec child follow, to main bp"}
138 timeout
{fail
"(timeout) vfork and exec child follow, to main bp" }
140 # The parent has been detached
; allow time
for any output it might
141 # generate to arrive
, so that output doesn
't get confused with
142 # any gdb_expected debugger output from a subsequent testpoint.
146 # Explicitly kill this child, or a subsequent rerun actually runs
147 # the exec'd child
, not the original
program...
150 -re
".*Kill the program being debugged.*y or n. $" {
152 send_gdb
"file $binfile\n"
154 -re
".*Load new symbol table from.*y or n. $" {
157 -re
"Reading symbols from.*$gdb_prompt $" {}
158 timeout
{ fail
"loading symbols (timeout)"; return }
161 -re
".*gdb_prompt $" {}
162 timeout
{ fail
"loading symbols (timeout)"; return }
165 -re
".*$gdb_prompt $" {}
166 timeout
{ fail
"killing inferior (timeout)" ; return }
170 proc vfork_and_exec_child_follow_through_step
{} {
174 # This test cannot be performed prior to HP
-UX
10.30, because ptrace
-based
175 # debugging of a vforking
program basically doesn
't allow the child to do
176 # things like hit a breakpoint between a vfork and exec. This means that
177 # saying "set follow child; next" at a vfork() call won't work
, because
178 # the implementation of
"next" sets a "step resume" breakpoint at the
179 #
return from the vfork
(), which the child will hit
on its way to exec
'ing.
181 if { ![istarget "hppa*-*-hpux11.*"] } {
182 verbose "vfork child-following next test ignored for non-hppa or pre-HP/UX-10.30 targets."
186 send_gdb "set follow child\n"
188 -re "$gdb_prompt $" {pass "set follow child, vfork and exec through step"}
189 timeout {fail "set follow child, vfork and exec through step"}
193 -re "Detaching from program.*Attaching after fork to.*Executing new program.*Breakpoint.*vforked-prog.c:9.*$gdb_prompt "\
194 {pass "vfork and exec child follow, through step"}
195 -re "$gdb_prompt $" {fail "vfork and exec child follow, through step"}
196 timeout {fail "(timeout) vfork and exec child follow, through step" }
198 # The parent has been detached; allow time for any output it might
199 # generate to arrive, so that output doesn't
get confused with
200 #
any expected debugger output from a subsequent testpoint.
204 # Explicitly kill this child
, or a subsequent rerun actually runs
205 # the exec
'd child, not the original program...
208 -re ".*Kill the program being debugged.*y or n. $" {
210 send_gdb "file $binfile\n"
212 -re ".*Load new symbol table from.*y or n. $" {
215 -re "Reading symbols from.*$gdb_prompt $" {}
216 timeout { fail "loading symbols (timeout)"; return }
219 -re ".*gdb_prompt $" {}
220 timeout { fail "loading symbols (timeout)"; return }
223 -re ".*$gdb_prompt $" {}
224 timeout { fail "killing inferior (timeout)" ; return }
228 proc tcatch_vfork_then_parent_follow {} {
232 send_gdb "set follow parent\n"
234 -re "$gdb_prompt $" {pass "set follow parent, tcatch vfork"}
235 timeout {fail "set follow parent, tcatch vfork"}
237 send_gdb "tcatch vfork\n"
239 -re "Catchpoint .*(vfork).*$gdb_prompt $"\
240 {pass "vfork parent follow, set tcatch vfork"}
241 -re "$gdb_prompt $" {fail "vfork parent follow, set tcatch vfork"}
242 timeout {fail "(timeout) vfork parent follow, set tcatch vfork"}
244 send_gdb "continue\n"
245 # HP-UX 10.20 seems to stop you in "vfork", while more recent HP-UXs
246 # stop you in "_vfork".
248 -re "0x\[0-9a-fA-F\]*.*vfork.*$gdb_prompt "\
249 {pass "vfork parent follow, tcatch vfork"}
250 -re "0x\[0-9a-fA-F\]*.*_vfork.*$gdb_prompt "\
251 {pass "vfork parent follow, tcatch vfork"}
252 -re "$gdb_prompt $" {fail "vfork parent follow, tcatch vfork"}
253 timeout {fail "(timeout) vfork parent follow, tcatch vfork"}
257 -re "Run till exit from.*vfork.*0x\[0-9a-fA-F\]* in main .* at .*${srcfile}:12.*$gdb_prompt "\
258 {pass "vfork parent follow, finish after tcatch vfork"}
259 -re "$gdb_prompt $" {fail "vfork parent follow, finish after tcatch vfork"}
260 timeout {fail "(timeout) vfork parent follow, finish after tcatch vfork" }
262 # The child has been detached; allow time for any output it might
263 # generate to arrive, so that output doesn't
get confused with
264 #
any expected debugger output from a subsequent testpoint.
269 proc tcatch_vfork_then_child_follow
{} {
273 send_gdb
"set follow child\n"
275 -re
"$gdb_prompt $" {pass "set follow child, tcatch vfork"}
276 timeout
{fail
"set follow child, tcatch vfork"}
278 send_gdb
"tcatch vfork\n"
280 -re
"Catchpoint .*(vfork).*$gdb_prompt $"\
281 {pass
"vfork child follow, set tcatch vfork"}
282 -re
"$gdb_prompt $" {fail "vfork child follow, set tcatch vfork"}
283 timeout
{fail
"(timeout) vfork child follow, set tcatch vfork"}
285 send_gdb
"continue\n"
286 # HP
-UX
10.20 seems to stop you in
"vfork", while more recent HP-UXs
287 # stop you in
"_vfork".
289 -re
"0x\[0-9a-fA-F\]*.*vfork.*$gdb_prompt "\
290 {pass
"vfork child follow, tcatch vfork"}
291 -re
"0x\[0-9a-fA-F\]*.*_vfork.*$gdb_prompt "\
292 {pass
"vfork child follow, tcatch vfork"}
293 -re
"$gdb_prompt $" {fail "vfork child follow, tcatch vfork"}
294 timeout
{fail
"(timeout) vfork child follow, tcatch vfork"}
298 -re
"Run till exit from.*vfork.*${srcfile2}:9.*$gdb_prompt "\
299 {pass
"vfork child follow, finish after tcatch vfork"}
300 -re
"$gdb_prompt $" {fail "vfork child follow, finish after tcatch vfork"}
301 timeout
{fail
"(timeout) vfork child follow, finish after tcatch vfork" }
303 # The parent has been detached
; allow time
for any output it might
304 # generate to arrive
, so that output doesn
't get confused with
305 # any expected debugger output from a subsequent testpoint.
310 proc do_vfork_and_exec_tests {} {
313 # Try following the parent process by stepping through a call to
314 # vfork. Do this without catchpoints.
315 if [runto_main] then { vfork_parent_follow_through_step }
317 # Try following the parent process by setting a breakpoint on the
318 # other side of a vfork, and running to that point. Do this
319 # without catchpoints.
320 if [runto_main] then { vfork_parent_follow_to_bp }
322 # Try following the child process by just continuing through the
323 # vfork, and letting the parent's breakpoint
on "main" be auto-
324 # magically reset in the child.
326 if [runto_main
] then { vfork_and_exec_child_follow_to_main_bp
}
328 # Try following the child process by stepping through a
call to
329 # vfork. The child also executes an exec. Since the child cannot
330 # be debugged until after it has exec
'd, and since there's a bp
on
331 #
"main" in the parent, and since the bp's for the parent are
332 # recomputed in the exec
'd child, the step through a vfork should
333 # land us in the "main" for the exec'd child
, too.
335 if [runto_main
] then { vfork_and_exec_child_follow_through_step
}
337 # Try catching a vfork
, and stepping out to the parent.
339 if [runto_main
] then { tcatch_vfork_then_parent_follow
}
341 # Try catching a vfork
, and stepping out to the child.
343 if [runto_main
] then { tcatch_vfork_then_child_follow
}
345 # Test the ability to follow both child and parent of a vfork.
Do
346 # this without catchpoints.
347 # ??rehrauer
: NYI. Will add testpoints here when implemented.
350 # Test the ability to have the debugger ask the user at vfork
-time
351 # whether to follow the parent
, child or both.
Do this without
353 # ??rehrauer
: NYI. Will add testpoints here when implemented.
357 # Start with a fresh gdb
361 gdb_reinitialize_dir $srcdir
/$subdir
365 # This is a test of gdb
's ability to follow the parent or child
366 # of a Unix vfork() system call. (The child will subsequently
367 # call a variant of a Unix exec() system call.)
369 do_vfork_and_exec_tests
371 set timeout $oldtimeout