From: Yao Qi Date: Fri, 17 Jun 2016 09:25:13 +0000 (+0100) Subject: Extend step-over-syscall.exp with different detach-on-fork and follow-fork modes X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=21a770913c24ab085fe66a5274ebe7cf9e031982;p=binutils-gdb.git Extend step-over-syscall.exp with different detach-on-fork and follow-fork modes This patch extends step-over-syscall.exp by setting different values to detach-on-fork and follow-fork. gdb/testsuite: 2016-06-17 Yao Qi * gdb.base/step-over-syscall.exp (break_cond_on_syscall): New parameters follow_fork and detach_on_fork. Set follow-fork-mode and detach-on-fork. Adjust tests. (top level): Invoke break_cond_on_syscall with combinations of syscall, follow-fork-mode and detach-on-fork. --- diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index fbdcd2b70e1..69aad53bfb1 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2016-06-17 Yao Qi + + * gdb.base/step-over-syscall.exp (break_cond_on_syscall): New + parameters follow_fork and detach_on_fork. Set follow-fork-mode + and detach-on-fork. Adjust tests. + (top level): Invoke break_cond_on_syscall with combinations of + syscall, follow-fork-mode and detach-on-fork. + 2016-06-17 Yao Qi * gdb.base/step-over-exit.c: New. diff --git a/gdb/testsuite/gdb.base/step-over-syscall.exp b/gdb/testsuite/gdb.base/step-over-syscall.exp index 7e5a719671d..e1d5ba1ee60 100644 --- a/gdb/testsuite/gdb.base/step-over-syscall.exp +++ b/gdb/testsuite/gdb.base/step-over-syscall.exp @@ -176,9 +176,11 @@ proc step_over_syscall { syscall } { # Set a breakpoint with a condition that evals false on syscall # instruction. In fact, it tests GDBserver steps over syscall -# instruction. +# instruction. SYSCALL is the syscall the program calls. +# FOLLOW_FORK is either "parent" or "child". DETACH_ON_FORK is +# "on" or "off". -proc break_cond_on_syscall { syscall } { +proc break_cond_on_syscall { syscall follow_fork detach_on_fork } { with_test_prefix "break cond on target : $syscall" { set testfile "step-over-$syscall" @@ -195,6 +197,8 @@ proc break_cond_on_syscall { syscall } { # Delete breakpoint syscall insns to avoid interference with other syscalls. delete_breakpoints + gdb_test "set follow-fork-mode $follow_fork" + gdb_test "set detach-on-fork $detach_on_fork" # Create a breakpoint with a condition that evals false. gdb_test "break \*$syscall_insn_addr if main == 0" \ @@ -212,9 +216,27 @@ proc break_cond_on_syscall { syscall } { gdb_test "break clone_fn if main == 0" } - gdb_test "break marker" "Breakpoint.*at.* file .*${testfile}.c, line.*" - gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, marker \\(\\) at.*" \ - "continue to marker ($syscall)" + if { $syscall == "clone" } { + # follow-fork and detach-on-fork only make sense to + # fork and vfork. + gdb_test "break marker" "Breakpoint.*at.* file .*${testfile}.c, line.*" + gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, marker \\(\\) at.*" \ + "continue to marker" + } else { + if { $follow_fork == "child" } { + gdb_test "continue" "exited normally.*" "continue to end of inf 2" + if { $detach_on_fork == "off" } { + gdb_test "inferior 1" + gdb_test "break marker" "Breakpoint.*at.*" + gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, marker \\(\\) at.*" \ + "continue to marker" + } + } else { + gdb_test "break marker" "Breakpoint.*at.* file .*${testfile}.c, line.*" + gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, marker \\(\\) at.*" \ + "continue to marker" + } + } } } @@ -243,7 +265,22 @@ gdb_test_multiple $test $test { } if { $cond_bp_target } { - break_cond_on_syscall "fork" - break_cond_on_syscall "vfork" - break_cond_on_syscall "clone" + + foreach_with_prefix detach-on-fork {"on" "off"} { + foreach_with_prefix follow-fork {"parent" "child"} { + foreach syscall { "fork" "vfork" "clone" } { + + if { $syscall == "vfork" + && ${follow-fork} == "parent" + && ${detach-on-fork} == "off" } { + # Both vforked child process and parent process are + # under GDB's control, but GDB follows the parent + # process only, which can't be run until vforked child + # finishes. Skip the test in this scenario. + continue + } + break_cond_on_syscall $syscall ${follow-fork} ${detach-on-fork} + } + } + } }