From 4719d415b9908d3c7981163b47be5096d03656f9 Mon Sep 17 00:00:00 2001 From: Yao Qi Date: Thu, 3 Mar 2016 09:17:45 +0000 Subject: [PATCH] New test about step over clone syscall This patch adds a new test for stepping over clone syscall. 2016-03-03 Yao Qi * gdb.base/step-over-syscall.exp (step_over_syscall): Kfail. Invoke step_over_syscall "clone" and break_cond_on_syscall "clone". * gdb.base/step-over-clone.c: New file. --- gdb/testsuite/ChangeLog | 7 +++ gdb/testsuite/gdb.base/step-over-clone.c | 54 ++++++++++++++++++++ gdb/testsuite/gdb.base/step-over-syscall.exp | 21 ++++++++ 3 files changed, 82 insertions(+) create mode 100644 gdb/testsuite/gdb.base/step-over-clone.c diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 54be3436083..645d8bd2756 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2016-03-03 Yao Qi + + * gdb.base/step-over-syscall.exp (step_over_syscall): Kfail. + Invoke step_over_syscall "clone" and break_cond_on_syscall + "clone". + * gdb.base/step-over-clone.c: New file. + 2016-03-03 Yao Qi * gdb.base/step-over-syscall.exp (disp_step_cross_syscall): Fix diff --git a/gdb/testsuite/gdb.base/step-over-clone.c b/gdb/testsuite/gdb.base/step-over-clone.c new file mode 100644 index 00000000000..57ecbbf4142 --- /dev/null +++ b/gdb/testsuite/gdb.base/step-over-clone.c @@ -0,0 +1,54 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2016 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 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, see . */ + +#define _GNU_SOURCE +#include +#include +#include + +static void +marker () +{} + +#define STACK_SIZE 0x1000 + +static int +clone_fn (void *unused) +{ + return 0; +} + +int +main (void) +{ + int i, pid; + unsigned char *stack[6]; + + for (i = 0; i < (sizeof (stack) / sizeof (stack[0])); i++) + stack[i] = malloc (STACK_SIZE); + + for (i = 0; i < (sizeof (stack) / sizeof (stack[0])); i++) + { + pid = clone (clone_fn, stack[i] + STACK_SIZE, CLONE_FILES | CLONE_VM, + NULL); + } + + for (i = 0; i < (sizeof (stack) / sizeof (stack[0])); i++) + free (stack[i]); + + marker (); +} diff --git a/gdb/testsuite/gdb.base/step-over-syscall.exp b/gdb/testsuite/gdb.base/step-over-syscall.exp index c77ffdcee0b..7e5a719671d 100644 --- a/gdb/testsuite/gdb.base/step-over-syscall.exp +++ b/gdb/testsuite/gdb.base/step-over-syscall.exp @@ -124,6 +124,13 @@ proc step_over_syscall { syscall } { continue } + if { $displaced == "on" && $syscall == "clone" } { + # GDB doesn't support stepping over clone syscall with + # displaced stepping. + kfail "gdb/19675" "single step over clone" + continue + } + set ret [setup $syscall] set syscall_insn_addr [lindex $ret 0] @@ -193,6 +200,18 @@ proc break_cond_on_syscall { syscall } { gdb_test "break \*$syscall_insn_addr if main == 0" \ "Breakpoint \[0-9\]* at .*" + if { $syscall == "clone" } { + # Create a breakpoint in the child with the condition that + # evals false, so that GDBserver can get the event from the + # child but GDB doesn't see it. In this way, we don't have + # to adjust the test flow for "clone". + # This is a regression test for PR server/19736. In this way, + # we can test that GDBserver gets an event from the child and + # set suspend count correctly while the parent is stepping over + # the breakpoint. + 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)" @@ -201,6 +220,7 @@ proc break_cond_on_syscall { syscall } { step_over_syscall "fork" step_over_syscall "vfork" +step_over_syscall "clone" set testfile "step-over-fork" clean_restart $testfile @@ -225,4 +245,5 @@ gdb_test_multiple $test $test { if { $cond_bp_target } { break_cond_on_syscall "fork" break_cond_on_syscall "vfork" + break_cond_on_syscall "clone" } -- 2.30.2