binutils-gdb/gdb/testsuite/gdb.base/foll-vfork.exp

387 lines
12 KiB
Plaintext
Raw Normal View History

# Copyright 1997, 1999, 2007-2012 Free Software Foundation, Inc.
1999-06-29 01:04:32 +02:00
# 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
1999-06-29 01:04:32 +02:00
# (at your option) any later version.
#
1999-06-29 01:04:32 +02:00
# 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.
#
1999-06-29 01:04:32 +02:00
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
1999-06-29 01:04:32 +02:00
if { [is_remote target] || ![isnative] } then {
1999-07-27 02:51:29 +02:00
continue
1999-06-29 01:04:32 +02:00
}
# Until "set follow-fork-mode" and "catch vfork" are implemented on
# other targets...
#
if {![istarget "hppa*-hp-hpux*"] && ![istarget "*-linux*"]} then {
continue
}
# Test to see if we are on an HP-UX 10.20 and if so,
# do not run these tests as catching vfork is disabled for
# 10.20.
if [istarget "hppa*-hp-hpux10.20"] then {
return 0
}
1999-06-29 01:04:32 +02:00
# NOTE drow/2002-12-06: I don't know what the referenced kernel problem
# is, but it appears to be fixed in recent HP/UX versions.
##if [istarget "hppa2.0w-hp-hpux*"] {
## warning "Don't run gdb.base/foll-vfork.exp until JAGaa43495 kernel problem is fixed."
## return 0
##}
1999-07-27 02:51:29 +02:00
standard_testfile
1999-06-29 01:04:32 +02:00
if {[build_executable $testfile.exp $testfile $srcfile {debug}] == -1} {
untested "failed to compile $testfile"
return -1
1999-06-29 01:04:32 +02:00
}
set testfile2 "vforked-prog"
set srcfile2 ${testfile2}.c
if {[build_executable $testfile.exp $testfile2 $srcfile2 {debug}] == -1} {
untested "failed to compile $testfile2"
return -1
1999-06-29 01:04:32 +02:00
}
# A few of these tests require a little more time than the standard
# timeout allows.
set oldtimeout $timeout
set timeout [expr "$timeout + 10"]
proc check_vfork_catchpoints {} {
global gdb_prompt
global has_vfork_catchpoints
# Verify that the system supports "catch vfork".
gdb_test "catch vfork" "Catchpoint \[0-9\]* \\(vfork\\)" "insert first vfork catchpoint"
set has_vfork_catchpoints 0
gdb_test_multiple "continue" "continue to first vfork catchpoint" {
2010-01-11 Thiago Jung Bauermann <bauerman@br.ibm.com> Convert hardware watchpoints to use breakpoint_ops. gdb/ * breakpoint.h (breakpoint_ops) <insert>: Rename to... <insert_location>: ... this. Return int instead of void. Accept pointer to struct bp_location instead of pointer to struct breakpoint. Adapt all implementations. (breakpoint_ops) <remove>: Rename to... <remove_location>: ... this. Accept pointer to struct bp_location instead of pointer to struct breakpoint. Adapt all implementations. * breakpoint.c (insert_catchpoint): Delete function. (insert_bp_location): Call the watchpoint or catchpoint's breakpoint_ops.insert method. (remove_breakpoint_1): Call the watchpoint or catchpoint's breakpoint_ops.remove method. (insert_watchpoint, remove_watchpoint): New functions. (watchpoint_breakpoint_ops): New structure. (watch_command_1): Initialize the OPS field. * inf-child.c (inf_child_insert_fork_catchpoint) (inf_child_remove_fork_catchpoint, inf_child_insert_vfork_catchpoint) (inf_child_remove_vfork_catchpoint, inf_child_insert_exec_catchpoint) (inf_child_remove_exec_catchpoint, inf_child_set_syscall_catchpoint): Delete functions. (inf_child_target): Remove initialization of to_insert_fork_catchpoint, to_remove_fork_catchpoint, to_insert_vfork_catchpoint, to_remove_vfork_catchpoint, to_insert_exec_catchpoint, to_remove_exec_catchpoint and to_set_syscall_catchpoint. * target.c (update_current_target): Change default implementation of to_insert_fork_catchpoint, to_remove_fork_catchpoint, to_insert_vfork_catchpoint, to_remove_vfork_catchpoint, to_insert_exec_catchpoint, to_remove_exec_catchpoint and to_set_syscall_catchpoint to return_one. (debug_to_insert_fork_catchpoint, debug_to_insert_vfork_catchpoint) (debug_to_insert_exec_catchpoint): Report return value. * target.h (to_insert_fork_catchpoint, to_insert_vfork_catchpoint) (to_insert_exec_catchpoint): Change declaration to return int instead of void. gdb/testsuite/ * gdb.base/foll-exec.exp: Adapt to new error string when the catchpoint type is not supported. * gdb.base/foll-fork.exp: Likewise. * gdb.base/foll-vfork.exp: Likewise.
2011-01-11 20:16:23 +01:00
-re ".*Your system does not support this type\r\nof catchpoint.*$gdb_prompt $" {
unsupported "continue to first vfork catchpoint"
}
-re ".*Catchpoint.*$gdb_prompt $" {
set has_vfork_catchpoints 1
pass "continue to first vfork catchpoint"
}
}
if {$has_vfork_catchpoints == 0} {
unsupported "vfork catchpoints"
return -code return
}
}
1999-06-29 01:04:32 +02:00
proc vfork_parent_follow_through_step {} {
with_test_prefix "vfork parent follow, through step" {
1999-06-29 01:04:32 +02:00
global gdb_prompt
gdb_test_no_output "set follow-fork parent"
set test "step"
gdb_test_multiple "next" $test {
-re "Detaching after fork from.*if \\(pid == 0\\).*$gdb_prompt " {
pass $test
}
1999-06-29 01:04:32 +02:00
}
# The child has been detached; allow time for any output it might
# generate to arrive, so that output doesn't get confused with
# any gdb_expected debugger output from a subsequent testpoint.
#
exec sleep 1
}}
1999-06-29 01:04:32 +02:00
proc vfork_parent_follow_to_bp {} {
with_test_prefix "vfork parent follow, to bp" {
1999-06-29 01:04:32 +02:00
global gdb_prompt
global srcfile
1999-06-29 01:04:32 +02:00
gdb_test_no_output "set follow-fork parent"
set bp_location [gdb_get_line_number "printf (\"I'm the proud parent of child"]
gdb_test "break ${srcfile}:${bp_location}" ".*" "break, vfork to bp"
set test "continue to bp"
gdb_test_multiple "continue" $test {
-re ".*Detaching after fork from child process.*Breakpoint.*${bp_location}.*$gdb_prompt " {
pass $test
}
1999-06-29 01:04:32 +02:00
}
# The child has been detached; allow time for any output it might
# generate to arrive, so that output doesn't get confused with
# any expected debugger output from a subsequent testpoint.
#
exec sleep 1
}}
1999-06-29 01:04:32 +02:00
# Kill child and reload symbols.
proc kill_child {} {
global binfile
global gdb_prompt
set test "killing inferior"
gdb_test_multiple "kill" $test {
-re ".*Kill the program being debugged.*y or n. $" {
gdb_test_no_output "y" ""
set test2 "file $binfile"
gdb_test_multiple "file $binfile" $test2 {
-re ".*Load new symbol table from.*y or n. $" {
send_gdb "y\n"
gdb_test_multiple "" "loading symbols" {
-re "Reading symbols from.*$gdb_prompt $" {
}
}
}
-re ".*gdb_prompt $" {
}
}
}
-re ".*$gdb_prompt $" {
}
}
}
1999-06-29 01:04:32 +02:00
proc vfork_and_exec_child_follow_to_main_bp {} {
with_test_prefix "vfork and exec child follow, to main bp" {
1999-06-29 01:04:32 +02:00
global gdb_prompt
global srcfile2
1999-06-29 01:04:32 +02:00
gdb_test_no_output "set follow-fork child"
set linenum [gdb_get_line_number "printf(\"Hello from vforked-prog" ${srcfile2}]
set test "continue to bp"
gdb_test_multiple "continue" $test {
-re "Attaching after.* vfork to.*xecuting new program.*Breakpoint.*vforked-prog.c:${linenum}.*$gdb_prompt " {
pass $test
}
1999-06-29 01:04:32 +02:00
}
# The parent has been detached; allow time for any output it might
# generate to arrive, so that output doesn't get confused with
# any gdb_expected debugger output from a subsequent testpoint.
#
exec sleep 1
# Explicitly kill this child, or a subsequent rerun actually runs
# the exec'd child, not the original program...
kill_child
}}
1999-06-29 01:04:32 +02:00
proc vfork_and_exec_child_follow_through_step {} {
with_test_prefix "vfork and exec child follow, through step" {
1999-06-29 01:04:32 +02:00
global gdb_prompt
global srcfile2
1999-06-29 01:04:32 +02:00
if { [istarget "hppa*-*-hpux*"] && ![istarget "hppa*-*-hpux11.*"] } {
# This test cannot be performed prior to HP-UX 10.30, because
# ptrace-based debugging of a vforking program basically doesn't
# allow the child to do things like hit a breakpoint between a
# vfork and exec. This means that saying "set follow-fork
# child; next" at a vfork() call won't work, because the
# implementation of "next" sets a "step resume" breakpoint at
# the return from the vfork(), which the child will hit on its
# way to exec'ing.
#
verbose "vfork child-following next test ignored for pre-HP/UX-10.30 targets."
1999-06-29 01:04:32 +02:00
return 0
}
gdb_test_no_output "set follow-fork child"
set test "step over vfork"
if { [istarget "hppa*-*-hpux*"]} {
# Since the child cannot be debugged until after it has exec'd,
# and since there's a bp on "main" in the parent, and since the
# bp's for the parent are recomputed in the exec'd child, the
# step through a vfork should land us in the "main" for the
# exec'd child, too.
#
set linenum [gdb_get_line_number "printf(\"Hello from vforked-prog" ${srcfile2}]
gdb_test_multiple "next" $test {
-re "Attaching after fork to.*Executing new program.*Breakpoint.*vforked-prog.c:${linenum}.*$gdb_prompt " {
pass "$test"
}
}
} else {
# The ideal support is to be able to debug the child even
# before it execs. Thus, "next" lands on the next line after
# the vfork.
gdb_test_multiple "next" $test {
-re "Attaching after .* vfork to child.*if \\(pid == 0\\).*$gdb_prompt " {
pass "$test"
}
}
1999-06-29 01:04:32 +02:00
}
# The parent has been detached; allow time for any output it might
# generate to arrive, so that output doesn't get confused with
# any expected debugger output from a subsequent testpoint.
#
exec sleep 1
# Explicitly kill this child, or a subsequent rerun actually runs
# the exec'd child, not the original program...
kill_child
}}
1999-06-29 01:04:32 +02:00
proc tcatch_vfork_then_parent_follow {} {
with_test_prefix "vfork parent follow, finish after tcatch vfork" {
1999-06-29 01:04:32 +02:00
global gdb_prompt
global srcfile
gdb_test_no_output "set follow-fork parent"
gdb_test "tcatch vfork" "Catchpoint .*(vfork).*"
# HP-UX 10.20 seems to stop you in "vfork", while more recent
# HP-UXs stop you in "_vfork".
set test "continue to vfork"
gdb_test_multiple "continue" $test {
-re "0x\[0-9a-fA-F\]*.*(vfork|__kernel_v?syscall).*$gdb_prompt " {
pass $test
}
-re "vfork \\(\\) at.*$gdb_prompt " {
pass $test
}
1999-06-29 01:04:32 +02:00
}
set linenum [gdb_get_line_number "pid = vfork ();"]
set test "finish"
gdb_test_multiple "finish" $test {
-re "Run till exit from.*vfork.*0x\[0-9a-fA-F\]* in main .* at .*${srcfile}:${linenum}.*$gdb_prompt " {
pass $test
}
-re "Run till exit from.*__kernel_v?syscall.*0x\[0-9a-fA-F\]* in vfork .*$gdb_prompt " {
send_gdb "finish\n"
exp_continue
}
1999-06-29 01:04:32 +02:00
}
# The child has been detached; allow time for any output it might
# generate to arrive, so that output doesn't get confused with
# any expected debugger output from a subsequent testpoint.
#
exec sleep 1
}}
1999-06-29 01:04:32 +02:00
proc tcatch_vfork_then_child_follow {} {
with_test_prefix "vfork child follow, finish after tcatch vfork" {
1999-06-29 01:04:32 +02:00
global gdb_prompt
global srcfile
1999-06-29 01:04:32 +02:00
global srcfile2
gdb_test_no_output "set follow-fork child"
gdb_test "tcatch vfork" "Catchpoint .*(vfork).*"
# HP-UX 10.20 seems to stop you in "vfork", while more recent HP-UXs
# stop you in "_vfork".
set test "continue to vfork"
gdb_test_multiple "continue" $test {
-re "vfork \\(\\) at .*$gdb_prompt $" {
pass $test
}
-re "0x\[0-9a-fA-F\]*.*(vfork|__kernel_v?syscall).*$gdb_prompt " {
pass $test
}
1999-06-29 01:04:32 +02:00
}
set linenum1 [gdb_get_line_number "pid = vfork ();"]
set linenum2 [gdb_get_line_number "printf(\"Hello from vforked-prog" ${srcfile2}]
set test "finish"
gdb_test_multiple "finish" $test {
-re "Run till exit from.*vfork.*${srcfile}:${linenum1}.*$gdb_prompt " {
pass $test
}
-re "Run till exit from.*__kernel_v?syscall.*0x\[0-9a-fA-F\]* in vfork .*$gdb_prompt " {
send_gdb "finish\n"
exp_continue
}
-re "Run till exit from.*vfork.*${srcfile2}:${linenum2}.*$gdb_prompt " {
pass "$test (followed exec)"
}
1999-06-29 01:04:32 +02:00
}
# The parent has been detached; allow time for any output it might
# generate to arrive, so that output doesn't get confused with
# any expected debugger output from a subsequent testpoint.
#
exec sleep 1
}}
1999-06-29 01:04:32 +02:00
proc do_vfork_and_exec_tests {} {
global gdb_prompt
# Check that vfork catchpoints are supported, as an indicator for whether
# vfork-following is supported.
if [runto_main] then { check_vfork_catchpoints }
1999-06-29 01:04:32 +02:00
# Try following the parent process by stepping through a call to
# vfork. Do this without catchpoints.
if [runto_main] then { vfork_parent_follow_through_step }
# Try following the parent process by setting a breakpoint on the
# other side of a vfork, and running to that point. Do this
# without catchpoints.
if [runto_main] then { vfork_parent_follow_to_bp }
# Try following the child process by just continuing through the
# vfork, and letting the parent's breakpoint on "main" be auto-
# magically reset in the child.
#
if [runto_main] then { vfork_and_exec_child_follow_to_main_bp }
# Try following the child process by stepping through a call to
# vfork. The child also executes an exec. Since the child cannot
# be debugged until after it has exec'd, and since there's a bp on
# "main" in the parent, and since the bp's for the parent are
# recomputed in the exec'd child, the step through a vfork should
# land us in the "main" for the exec'd child, too.
#
if [runto_main] then { vfork_and_exec_child_follow_through_step }
# Try catching a vfork, and stepping out to the parent.
#
if [runto_main] then { tcatch_vfork_then_parent_follow }
# Try catching a vfork, and stepping out to the child.
#
if [runto_main] then { tcatch_vfork_then_child_follow }
# Test the ability to follow both child and parent of a vfork. Do
# this without catchpoints.
# ??rehrauer: NYI. Will add testpoints here when implemented.
#
# Test the ability to have the debugger ask the user at vfork-time
# whether to follow the parent, child or both. Do this without
# catchpoints.
# ??rehrauer: NYI. Will add testpoints here when implemented.
#
}
# Start with a fresh gdb
clean_restart $testfile
1999-06-29 01:04:32 +02:00
# The "Detaching..." and "Attaching..." messages may be hidden by
# default.
2010-06-01 Michael Snyder <msnyder@vmware.com> * gdb.base/arithmet.exp: Use gdb_test_no_output. * gdb.base/arrayidx.exp: Ditto. * gdb.base/attach.exp: Ditto. * gdb.base/auxv.exp: Ditto. * gdb.base/bigcre.exp: Ditto. * gdb.base/break-always.exp: Ditto. * gdb.base/break-interp.exp: Ditto. * gdb.base/break.exp: Ditto. * gdb.base/breakpoint-shadow.exp: Ditto. * gdb.base/call-ar-st.exp: Ditto. * gdb.base/call-sc.exp: Ditto. * gdb.base/call-signal-resume.exp: Ditto. * gdb.base/callfuncs.exp: Ditto. * gdb.base/catch-syscall.exp: Ditto. * gdb.base/charset.exp: Ditto. * gdb.base/code-expr.exp: Ditto. * gdb.base/commands.exp: Ditto. * gdb.base/cond-expr.exp: Ditto. * gdb.base/condbreak.exp: Ditto. * gdb.base/cursal.exp: Ditto. * gdb.base/cvexpr.exp: Ditto. * gdb.base/default.exp: Ditto. * gdb.base/del.exp: Ditto. * gdb.base/detach.exp: Ditto. * gdb.base/display.exp: Ditto. * gdb.base/ena-dis-br.exp: Ditto. * gdb.base/eval-skip.exp: Ditto. * gdb.base/foll-fork.exp: Ditto. * gdb.base/foll-vfork.exp: Ditto. * gdb.base/frame-args.exp: Ditto. * gdb.base/funcargs.exp: Ditto. * gdb.base/gcore-buffer-overflow.exp: Ditto. * gdb.base/gdbvars.exp: Ditto. * gdb.base/help.exp: Ditto. * gdb.base/ifelse.exp: Ditto. * gdb.base/included.exp: Ditto. * gdb.base/list.exp: Ditto. * gdb.base/macscp.exp: Ditto. * gdb.base/maint.exp: Ditto. * gdb.base/multi-fork.exp: Ditto. * gdb.base/overlays.exp: Ditto. * gdb.base/page.exp: Ditto. * gdb.base/pending.exp: Ditto. * gdb.base/pointers.exp: Ditto. * gdb.base/pr11022.exp: Ditto. * gdb.base/prelink.exp: Ditto. * gdb.base/printcmds.exp: Ditto. * gdb.base/psymtab.exp: Ditto. * gdb.base/randomize.exp: Ditto. * gdb.base/relational.exp: Ditto. * gdb.base/relocate.exp: Ditto. * gdb.base/remote.exp: Ditto. * gdb.base/sepdebug.exp: Ditto. * gdb.base/set-lang-auto.exp: Ditto. * gdb.base/setshow.exp: Ditto. * gdb.base/setvar.exp: Ditto. * gdb.base/signals.exp: Ditto. * gdb.base/signull.exp: Ditto. * gdb.base/sigstep.exp: Ditto. * gdb.base/sizeof.exp: Ditto. * gdb.base/solib-disc.exp: Ditto. * gdb.base/store.exp: Ditto. * gdb.base/structs.exp: Ditto. * gdb.base/structs2.exp: Ditto. * gdb.base/subst.exp: Ditto. * gdb.base/term.exp: Ditto. * gdb.base/trace-commands.exp: Ditto. * gdb.base/unwindonsignal.exp: Ditto. * gdb.base/valgrind-db-attach.exp: Ditto. * gdb.base/varargs.exp: Ditto. * gdb.base/watch-cond.exp: Ditto. * gdb.base/watch_thread_num.exp: Ditto. * gdb.base/watchpoint-cond-gone.exp: Ditto. * gdb.base/watchpoint.exp: Ditto. * gdb.base/whatis-exp.exp: Ditto.
2010-06-01 23:29:21 +02:00
gdb_test_no_output "set verbose"
1999-06-29 01:04:32 +02:00
# This is a test of gdb's ability to follow the parent or child
# of a Unix vfork() system call. (The child will subsequently
# call a variant of a Unix exec() system call.)
#
do_vfork_and_exec_tests
set timeout $oldtimeout
return 0