gdb:
[deliverable/binutils-gdb.git] / gdb / testsuite / gdb.base / foll-vfork.exp
index 1fed06bb96681c41196f4dba221dc061d2d4952f..e55d7005635e2073a8da0e7b8f7c24f48ae5e327 100644 (file)
@@ -1,38 +1,33 @@
-#   Copyright 1997, 1999 Free Software Foundation, Inc.
+#   Copyright 1997, 1999, 2007, 2008, 2009, 2010
+#   Free Software Foundation, Inc.
 
 # 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 2 of the License, or
+# the Free Software Foundation; either version 3 of the License, or
 # (at your option) any later version.
-# 
+#
 # 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.
-# 
+#
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
-
-# Please email any bugs, comments, and/or additions to this file to:
-# bug-gdb@prep.ai.mit.edu
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-if $tracelevel then {
-       strace $tracelevel
-       }
-
-if { ![isnative] } then {
+if { [is_remote target] || ![isnative] } then {
     continue
 }
 
-set prms_id 0
-set bug_id 0
 
-if [istarget "hppa2.0w-hp-hpux*"] {
-  warning "Don't run gdb.base/foll-vfork.exp until JAGaa43495 kernel problem is fixed."
-  return 0
-}
+# 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
+##}
+
+global srcfile
 set testfile "foll-vfork"
 set testfile2 "vforked-prog"
 set srcfile ${testfile}.c
@@ -41,18 +36,20 @@ set binfile ${objdir}/${subdir}/${testfile}
 set binfile2 ${objdir}/${subdir}/${testfile2}
 
 if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
-     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
+     untested foll-vfork.exp
+     return -1
 }
 
 if  { [gdb_compile "${srcdir}/${subdir}/${srcfile2}" "${binfile2}" executable {debug}] != "" } {
-     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
+     untested foll-vfork.exp
+     return -1
 }
 
 
 # Until "set follow-fork-mode" and "catch vfork" are implemented on
 # other targets...
 #
-if ![istarget "hppa*-hp-hpux*"] then {
+if {![istarget "hppa*-hp-hpux*"] && ![istarget "*-linux*"]} then {
     continue
 }
 
@@ -69,13 +66,36 @@ if [istarget "hppa*-hp-hpux10.20"] then {
 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" {
+    -re ".*Your system does not support vfork catchpoints.*$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
+  }
+}
+
 proc vfork_parent_follow_through_step {} {
    global gdb_prompt
 
-   send_gdb "set follow parent\n"
+   send_gdb "set follow-fork parent\n"
    gdb_expect {
-      -re "$gdb_prompt $" {pass "set follow parent, vfork through step"}
-      timeout         {fail "set follow parent, vfork through step"}
+      -re "$gdb_prompt $" {pass "set follow-fork parent, vfork through step"}
+      timeout         {fail "set follow-fork parent, vfork through step"}
    }
    send_gdb "next\n"
    gdb_expect {
@@ -93,20 +113,21 @@ proc vfork_parent_follow_through_step {} {
 
 proc vfork_parent_follow_to_bp {} {
    global gdb_prompt
+   global srcfile
 
-   send_gdb "set follow parent\n"
+   send_gdb "set follow-fork parent\n"
    gdb_expect {
-      -re "$gdb_prompt $" {pass "set follow parent, vfork to bp"}
-      timeout         {fail "set follow parent, vfork to bp"}
+      -re "$gdb_prompt $" {pass "set follow-fork parent, vfork to bp"}
+      timeout         {fail "set follow-fork parent, vfork to bp"}
    }
-   send_gdb "break 18\n"
+   send_gdb "break ${srcfile}:18\n"
    gdb_expect {
       -re "$gdb_prompt $" {pass "break, vfork to bp"}
       timeout         {fail "break, vfork to bp"}
    }
    send_gdb "continue\n"
    gdb_expect {
-      -re ".*Detaching after fork from process.*Breakpoint.*18.*$gdb_prompt "\
+      -re ".*Detaching after fork from child process.*Breakpoint.*18.*$gdb_prompt "\
                       {pass "vfork parent follow, to bp"}
       -re "$gdb_prompt $" {fail "vfork parent follow, to bp"}
       timeout         {fail "(timeout) vfork parent follow, to bp" }
@@ -122,14 +143,14 @@ proc vfork_and_exec_child_follow_to_main_bp {} {
    global gdb_prompt
    global binfile
 
-   send_gdb "set follow child\n"
+   send_gdb "set follow-fork child\n"
    gdb_expect {
-      -re "$gdb_prompt $" {pass "set follow child, vfork and exec to main bp"}
-      timeout         {fail "set follow child, vfork and exec to main bp"}
+      -re "$gdb_prompt $" {pass "set follow-fork child, vfork and exec to main bp"}
+      timeout         {fail "set follow-fork child, vfork and exec to main bp"}
    }
    send_gdb "continue\n"
    gdb_expect {
-      -re "Detaching from program.*Attaching after fork to.*Executing new program.*Breakpoint.*vforked-prog.c:9.*$gdb_prompt "\
+      -re "Attaching after.* vfork to.*xecuting new program.*Breakpoint.*vforked-prog.c:9.*$gdb_prompt "\
                       {pass "vfork and exec child follow, to main bp"}
       -re "$gdb_prompt $" {fail "vfork and exec child follow, to main bp"}
       timeout         {fail "(timeout) vfork and exec child follow, to main bp" }
@@ -171,7 +192,7 @@ proc vfork_and_exec_child_follow_through_step {} {
 # 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 child; next" at a vfork() call won't work, because
+# 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.
 #
@@ -180,14 +201,14 @@ proc vfork_and_exec_child_follow_through_step {} {
       return 0
    }
 
-   send_gdb "set follow child\n"
+   send_gdb "set follow-fork child\n"
    gdb_expect {
-      -re "$gdb_prompt $" {pass "set follow child, vfork and exec through step"}
-      timeout         {fail "set follow child, vfork and exec through step"}
+      -re "$gdb_prompt $" {pass "set follow-fork child, vfork and exec through step"}
+      timeout         {fail "set follow-fork child, vfork and exec through step"}
    }
    send_gdb "next\n"
    gdb_expect {
-      -re "Detaching from program.*Attaching after fork to.*Executing new program.*Breakpoint.*vforked-prog.c:9.*$gdb_prompt "\
+      -re "Attaching after fork to.*Executing new program.*Breakpoint.*vforked-prog.c:9.*$gdb_prompt "\
                       {pass "vfork and exec child follow, through step"}
       -re "$gdb_prompt $" {fail "vfork and exec child follow, through step"}
       timeout         {fail "(timeout) vfork and exec child follow, through step" }
@@ -226,10 +247,10 @@ proc tcatch_vfork_then_parent_follow {} {
    global gdb_prompt
    global srcfile
 
-   send_gdb "set follow parent\n"
+   send_gdb "set follow-fork parent\n"
    gdb_expect {
-      -re "$gdb_prompt $" {pass "set follow parent, tcatch vfork"}
-      timeout         {fail "set follow parent, tcatch vfork"}
+      -re "$gdb_prompt $" {pass "set follow-fork parent, tcatch vfork"}
+      timeout         {fail "set follow-fork parent, tcatch vfork"}
    }
    send_gdb "tcatch vfork\n"
    gdb_expect {
@@ -242,9 +263,9 @@ proc tcatch_vfork_then_parent_follow {} {
 # HP-UX 10.20 seems to stop you in "vfork", while more recent HP-UXs
 # stop you in "_vfork".
    gdb_expect {
-      -re "0x\[0-9a-fA-F\]*.*vfork.*$gdb_prompt "\
+      -re "0x\[0-9a-fA-F\]*.*(vfork|__kernel_v?syscall).*$gdb_prompt "\
                       {pass "vfork parent follow, tcatch vfork"}
-      -re "0x\[0-9a-fA-F\]*.*_vfork.*$gdb_prompt "\
+      -re "vfork \\(\\) at.*$gdb_prompt "\
                       {pass "vfork parent follow, tcatch vfork"}
       -re "$gdb_prompt $" {fail "vfork parent follow, tcatch vfork"}
       timeout         {fail "(timeout) vfork parent follow, tcatch vfork"}
@@ -253,6 +274,10 @@ proc tcatch_vfork_then_parent_follow {} {
    gdb_expect {
       -re "Run till exit from.*vfork.*0x\[0-9a-fA-F\]* in main .* at .*${srcfile}:12.*$gdb_prompt "\
                       {pass "vfork parent follow, finish after tcatch vfork"}
+      -re "Run till exit from.*__kernel_v?syscall.*0x\[0-9a-fA-F\]* in vfork .*$gdb_prompt " {
+         send_gdb "finish\n"
+         exp_continue
+      }
       -re "$gdb_prompt $" {fail "vfork parent follow, finish after tcatch vfork"}
       timeout         {fail "(timeout) vfork parent follow, finish after tcatch vfork" }
    }
@@ -265,12 +290,13 @@ proc tcatch_vfork_then_parent_follow {} {
 
 proc tcatch_vfork_then_child_follow {} {
    global gdb_prompt
+   global srcfile
    global srcfile2
 
-   send_gdb "set follow child\n"
+   send_gdb "set follow-fork child\n"
    gdb_expect {
-      -re "$gdb_prompt $" {pass "set follow child, tcatch vfork"}
-      timeout         {fail "set follow child, tcatch vfork"}
+      -re "$gdb_prompt $" {pass "set follow-fork child, tcatch vfork"}
+      timeout         {fail "set follow-fork child, tcatch vfork"}
    }
    send_gdb "tcatch vfork\n"
    gdb_expect {
@@ -283,17 +309,23 @@ proc tcatch_vfork_then_child_follow {} {
 # HP-UX 10.20 seems to stop you in "vfork", while more recent HP-UXs
 # stop you in "_vfork".
    gdb_expect {
-      -re "0x\[0-9a-fA-F\]*.*vfork.*$gdb_prompt "\
+      -re "vfork \\(\\) at .*$gdb_prompt $"\
                       {pass "vfork child follow, tcatch vfork"}
-      -re "0x\[0-9a-fA-F\]*.*_vfork.*$gdb_prompt "\
+      -re "0x\[0-9a-fA-F\]*.*(vfork|__kernel_v?syscall).*$gdb_prompt "\
                       {pass "vfork child follow, tcatch vfork"}
       -re "$gdb_prompt $" {fail "vfork child follow, tcatch vfork"}
       timeout         {fail "(timeout) vfork child follow, tcatch vfork"}
    }
    send_gdb "finish\n"
    gdb_expect {
-      -re "Run till exit from.*vfork.*${srcfile2}:9.*$gdb_prompt "\
+      -re "Run till exit from.*vfork.*${srcfile}:12.*$gdb_prompt "\
                       {pass "vfork child follow, finish after tcatch vfork"}
+      -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}:9.*$gdb_prompt "\
+                      {pass "vfork child follow, finish after tcatch vfork (followed exec)"}
       -re "$gdb_prompt $" {fail "vfork child follow, finish after tcatch vfork"}
       timeout         {fail "(timeout) vfork child follow, finish after tcatch vfork" }
    }
@@ -307,6 +339,10 @@ proc tcatch_vfork_then_child_follow {} {
 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 }
+
    # 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 }
@@ -358,6 +394,9 @@ gdb_start
 gdb_reinitialize_dir $srcdir/$subdir
 gdb_load ${binfile}
 
+# The "Detaching..." and "Attaching..." messages may be hidden by
+# default.
+gdb_test_no_output "set verbose"
 
 # This is a test of gdb's ability to follow the parent or child
 # of a Unix vfork() system call.  (The child will subsequently
This page took 0.032961 seconds and 4 git commands to generate.