This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH 7/8] Rename disp-step-syscall.exp to step-over-syscall.exp
- From: Yao Qi <qiyaoltc at gmail dot com>
- To: gdb-patches at sourceware dot org
- Date: Fri, 19 Feb 2016 14:36:33 +0000
- Subject: [PATCH 7/8] Rename disp-step-syscall.exp to step-over-syscall.exp
- Authentication-results: sourceware.org; auth=none
- References: <1455892594-2294-1-git-send-email-yao dot qi at linaro dot org>
disp-step-syscall.exp is extended for stepping over syscall instruction
in different cases, with or without displaced stepping, and stepping
over by GDBserver.
This patch rename disp-step-syscall.exp to step-over-syscall.exp to
reflect this.
gdb/testsuite:
2016-02-19 Yao Qi <yao.qi@linaro.org>
* gdb.base/disp-step-fork.c: Rename to ...
* gdb.base/step-over-fork.c: ... it. New file.
* gdb.base/disp-step-vfork.c: Rename to ...
* gdb.base/step-over-vfork.c: ... it. New file.
* gdb.base/disp-step-syscall.exp: Rename to ...
* gdb.base/step-over-syscall.exp: ... it. New file.
(disp_step_cross_syscall): Rename to ...
(step_over_syscall): ... it.
---
gdb/testsuite/gdb.base/disp-step-fork.c | 43 ------
gdb/testsuite/gdb.base/disp-step-syscall.exp | 208 ---------------------------
gdb/testsuite/gdb.base/disp-step-vfork.c | 47 ------
gdb/testsuite/gdb.base/step-over-fork.c | 43 ++++++
gdb/testsuite/gdb.base/step-over-syscall.exp | 208 +++++++++++++++++++++++++++
gdb/testsuite/gdb.base/step-over-vfork.c | 47 ++++++
6 files changed, 298 insertions(+), 298 deletions(-)
delete mode 100644 gdb/testsuite/gdb.base/disp-step-fork.c
delete mode 100644 gdb/testsuite/gdb.base/disp-step-syscall.exp
delete mode 100644 gdb/testsuite/gdb.base/disp-step-vfork.c
create mode 100644 gdb/testsuite/gdb.base/step-over-fork.c
create mode 100644 gdb/testsuite/gdb.base/step-over-syscall.exp
create mode 100644 gdb/testsuite/gdb.base/step-over-vfork.c
diff --git a/gdb/testsuite/gdb.base/disp-step-fork.c b/gdb/testsuite/gdb.base/disp-step-fork.c
deleted file mode 100644
index 6d477ea..0000000
--- a/gdb/testsuite/gdb.base/disp-step-fork.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* This testcase is part of GDB, the GNU debugger.
-
- Copyright 2011-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 <http://www.gnu.org/licenses/>. */
-
-#include <stdlib.h>
-#include <unistd.h>
-
-static void
-marker () {}
-
-int
-main (void)
-{
- int i, pid;
-
- for (i = 0; i < 6; i++)
- {
- pid = fork ();
- if (pid == 0) /* child */
- {
- exit (0); /* at exit */
- }
- else
- {
- }
- }
-
- marker ();
-
-}
diff --git a/gdb/testsuite/gdb.base/disp-step-syscall.exp b/gdb/testsuite/gdb.base/disp-step-syscall.exp
deleted file mode 100644
index 128bb78..0000000
--- a/gdb/testsuite/gdb.base/disp-step-syscall.exp
+++ /dev/null
@@ -1,208 +0,0 @@
-# This testcase is part of GDB, the GNU debugger.
-
-# Copyright 2011-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 <http://www.gnu.org/licenses/>.
-
-set syscall_insn ""
-
-# Define the syscall instruction for each target.
-
-if { [istarget "i\[34567\]86-*-linux*"] || [istarget "x86_64-*-linux*"] } {
- set syscall_insn "\[ \t\](int|syscall|sysenter)\[ \t\]"
-} elseif { [istarget "aarch64*-*-linux*"] || [istarget "arm*-*-linux*"] } {
- set syscall_insn "\[ \t\](swi|svc)\[ \t\]"
-} else {
- return -1
-}
-
-proc check_pc_after_cross_syscall { syscall syscall_insn_next_addr } {
- set syscall_insn_next_addr_found [get_hexadecimal_valueof "\$pc" "0"]
-
- set test "single step over $syscall final pc"
- if {$syscall_insn_next_addr != 0
- && $syscall_insn_next_addr == $syscall_insn_next_addr_found} {
- pass $test
- } else {
- fail $test
- }
-}
-
-proc disp_step_cross_syscall { syscall } {
- with_test_prefix "$syscall" {
- global syscall_insn
- global gdb_prompt
-
- set testfile "disp-step-$syscall"
-
- if [prepare_for_testing ${testfile}.exp ${testfile} ${testfile}.c {debug}] {
- untested ${testfile}.exp
- return -1
- }
-
- if { ![runto main] } then {
- fail "run to main ($syscall)"
- return
- }
-
- # Delete the breakpoint on main.
- gdb_test_no_output "delete break 1"
-
- gdb_test "break marker" "Breakpoint.*at.* file .*${testfile}.c, line.*"
- gdb_test_no_output "set displaced-stepping off"
-
- set syscall_bp 0
- gdb_test_multiple "break $syscall" "break $syscall" {
- -re "Breakpoint (\[0-9\]*) at .*$gdb_prompt $" {
- set syscall_bp $expect_out(1,string)
- pass "break $syscall"
- }
- }
-
- gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, (.* in |__libc_|)$syscall \\(\\).*" \
- "continue to $syscall (1st time)"
- # Hit the breakpoint on $syscall for the first time. In this time, we will let PLT
- # resolution done, and the number single steps we will do later will be
- # reduced.
-
- gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, (.* in |__libc_|)$syscall \\(\\).*" \
- "continue to $syscall (2nd time)"
- # Hit the breakpoint on $syscall for the second time. In this time, the address
- # of syscall insn and next insn of syscall are recorded.
-
- gdb_test "display/i \$pc" ".*"
-
-
- # Single step until we see a syscall insn or we reach the
- # upper bound of loop iterations.
- set msg "find syscall insn in $syscall"
- set steps 0
- set max_steps 1000
- gdb_test_multiple "stepi" $msg {
- -re ".*$syscall_insn.*$gdb_prompt $" {
- pass $msg
- }
- -re "x/i .*=>.*\r\n$gdb_prompt $" {
- incr steps
- if {$steps == $max_steps} {
- fail $msg
- } else {
- send_gdb "stepi\n"
- exp_continue
- }
- }
- }
-
- if {$steps == $max_steps} {
- return -1
- }
-
- set syscall_insn_addr [get_hexadecimal_valueof "\$pc" "0"]
- if {[gdb_test "stepi" "x/i .*=>.*" "stepi $syscall insn"] != 0} {
- return -1
- }
- set syscall_insn_next_addr [get_hexadecimal_valueof "\$pc" "0"]
-
- set disp_step_opts { "off" }
- if { [support_displaced_stepping] } {
- lappend disp_step_opts "on"
- }
-
- foreach displaced $disp_step_opts {
- with_test_prefix "displaced $displaced" {
-
- gdb_test "continue" \
- "Continuing\\..*Breakpoint \[0-9\]+, (.* in |__libc_|)$syscall \\(\\).*" \
- "continue to $syscall (3rd time)"
-
- # Hit the breakpoint on $syscall for the third time.
- # In this time, we'll set breakpoint on the syscall insn
- # we recorded previously, and single step over it.
-
- set syscall_insn_bp 0
- gdb_test_multiple "break \*$syscall_insn_addr" \
- "break on syscall insn" {
- -re "Breakpoint (\[0-9\]*) at .*$gdb_prompt $" {
- set syscall_insn_bp $expect_out(1,string)
- pass "break on syscall insns"
- }
- }
-
- gdb_test "continue" \
- "Continuing\\..*Breakpoint \[0-9\]+, .*" \
- "continue to syscall insn $syscall"
-
- gdb_test_no_output "set displaced-stepping $displaced"
-
- # Check the address of next instruction of syscall.
- if {[gdb_test "stepi" "x/i .*=>.*" "single step over $syscall"] != 0} {
- return -1
- }
-
- check_pc_after_cross_syscall $syscall $syscall_insn_next_addr
-
- # Delete breakpoint syscall insns to avoid interference
- # to other syscalls.
- gdb_test_no_output "delete $syscall_insn_bp" \
- "delete break $syscall insn"
- }
- }
-
- with_test_prefix "break cond on target" {
- set cond_bp_target 1
-
- set test "set breakpoint condition-evaluation target"
- gdb_test_multiple $test $test {
- -re "warning: Target does not support breakpoint condition evaluation.\r\nUsing host evaluation mode instead.\r\n$gdb_prompt $" {
- # Target doesn't support breakpoint condition
- # evaluation on its side.
- set cond_bp_target 0
- }
- -re "^$test\r\n$gdb_prompt $" {
- }
- }
-
- if { $cond_bp_target } {
- gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, (.* in |__libc_|)$syscall \\(\\).*" \
- "continue to $syscall"
-
- # Create a breakpoint with the condition which is false.
- set syscall_insn_bp 0
- gdb_test_multiple "break \*$syscall_insn_addr if main == 0" \
- "break on syscall insns" {
- -re "Breakpoint (\[0-9\]*) at .*$gdb_prompt $" {
- set syscall_insn_bp $expect_out(1,string)
- pass "break on syscall insns"
- }
- }
-
- gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, (.* in |__libc_|)$syscall \\(\\).*" \
- "continue to $syscall again"
-
- # Delete breakpoint syscall insns to avoid interference to
- # other syscalls.
- gdb_test_no_output "delete $syscall_insn_bp" \
- "delete break $syscall insn"
- }
- }
-
- gdb_test_no_output "delete $syscall_bp" "delete break $syscall"
-
- gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, marker \\(\\) at.*" \
- "continue to marker ($syscall)"
- }
-}
-
-disp_step_cross_syscall "fork"
-disp_step_cross_syscall "vfork"
diff --git a/gdb/testsuite/gdb.base/disp-step-vfork.c b/gdb/testsuite/gdb.base/disp-step-vfork.c
deleted file mode 100644
index 35665ab..0000000
--- a/gdb/testsuite/gdb.base/disp-step-vfork.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/* This testcase is part of GDB, the GNU debugger.
-
- Copyright 2011-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 <http://www.gnu.org/licenses/>. */
-
-#include <unistd.h>
-
-static void
-marker () {}
-
-int
-main (void)
-{
- int i, pid;
-
- for (i = 0; i < 6; i++)
- {
- pid = vfork ();
- if (pid == -1)
- {
- return 1;
- }
- else if (pid != 0)
- {
- }
- else
- {
- _exit (0);
- }
- }
-
- marker ();
- return 0;
-
-}
diff --git a/gdb/testsuite/gdb.base/step-over-fork.c b/gdb/testsuite/gdb.base/step-over-fork.c
new file mode 100644
index 0000000..6d477ea
--- /dev/null
+++ b/gdb/testsuite/gdb.base/step-over-fork.c
@@ -0,0 +1,43 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2011-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 <http://www.gnu.org/licenses/>. */
+
+#include <stdlib.h>
+#include <unistd.h>
+
+static void
+marker () {}
+
+int
+main (void)
+{
+ int i, pid;
+
+ for (i = 0; i < 6; i++)
+ {
+ pid = fork ();
+ if (pid == 0) /* child */
+ {
+ exit (0); /* at exit */
+ }
+ else
+ {
+ }
+ }
+
+ marker ();
+
+}
diff --git a/gdb/testsuite/gdb.base/step-over-syscall.exp b/gdb/testsuite/gdb.base/step-over-syscall.exp
new file mode 100644
index 0000000..863194b
--- /dev/null
+++ b/gdb/testsuite/gdb.base/step-over-syscall.exp
@@ -0,0 +1,208 @@
+# This testcase is part of GDB, the GNU debugger.
+
+# Copyright 2011-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 <http://www.gnu.org/licenses/>.
+
+set syscall_insn ""
+
+# Define the syscall instruction for each target.
+
+if { [istarget "i\[34567\]86-*-linux*"] || [istarget "x86_64-*-linux*"] } {
+ set syscall_insn "\[ \t\](int|syscall|sysenter)\[ \t\]"
+} elseif { [istarget "aarch64*-*-linux*"] || [istarget "arm*-*-linux*"] } {
+ set syscall_insn "\[ \t\](swi|svc)\[ \t\]"
+} else {
+ return -1
+}
+
+proc check_pc_after_cross_syscall { syscall syscall_insn_next_addr } {
+ set syscall_insn_next_addr_found [get_hexadecimal_valueof "\$pc" "0"]
+
+ set test "single step over $syscall final pc"
+ if {$syscall_insn_next_addr != 0
+ && $syscall_insn_next_addr == $syscall_insn_next_addr_found} {
+ pass $test
+ } else {
+ fail $test
+ }
+}
+
+proc step_over_syscall { syscall } {
+ with_test_prefix "$syscall" {
+ global syscall_insn
+ global gdb_prompt
+
+ set testfile "step-over-$syscall"
+
+ if [prepare_for_testing ${testfile}.exp ${testfile} ${testfile}.c {debug}] {
+ untested ${testfile}.exp
+ return -1
+ }
+
+ if { ![runto main] } then {
+ fail "run to main ($syscall)"
+ return
+ }
+
+ # Delete the breakpoint on main.
+ gdb_test_no_output "delete break 1"
+
+ gdb_test "break marker" "Breakpoint.*at.* file .*${testfile}.c, line.*"
+ gdb_test_no_output "set displaced-stepping off"
+
+ set syscall_bp 0
+ gdb_test_multiple "break $syscall" "break $syscall" {
+ -re "Breakpoint (\[0-9\]*) at .*$gdb_prompt $" {
+ set syscall_bp $expect_out(1,string)
+ pass "break $syscall"
+ }
+ }
+
+ gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, (.* in |__libc_|)$syscall \\(\\).*" \
+ "continue to $syscall (1st time)"
+ # Hit the breakpoint on $syscall for the first time. In this time, we will let PLT
+ # resolution done, and the number single steps we will do later will be
+ # reduced.
+
+ gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, (.* in |__libc_|)$syscall \\(\\).*" \
+ "continue to $syscall (2nd time)"
+ # Hit the breakpoint on $syscall for the second time. In this time, the address
+ # of syscall insn and next insn of syscall are recorded.
+
+ gdb_test "display/i \$pc" ".*"
+
+
+ # Single step until we see a syscall insn or we reach the
+ # upper bound of loop iterations.
+ set msg "find syscall insn in $syscall"
+ set steps 0
+ set max_steps 1000
+ gdb_test_multiple "stepi" $msg {
+ -re ".*$syscall_insn.*$gdb_prompt $" {
+ pass $msg
+ }
+ -re "x/i .*=>.*\r\n$gdb_prompt $" {
+ incr steps
+ if {$steps == $max_steps} {
+ fail $msg
+ } else {
+ send_gdb "stepi\n"
+ exp_continue
+ }
+ }
+ }
+
+ if {$steps == $max_steps} {
+ return -1
+ }
+
+ set syscall_insn_addr [get_hexadecimal_valueof "\$pc" "0"]
+ if {[gdb_test "stepi" "x/i .*=>.*" "stepi $syscall insn"] != 0} {
+ return -1
+ }
+ set syscall_insn_next_addr [get_hexadecimal_valueof "\$pc" "0"]
+
+ set disp_step_opts { "off" }
+ if { [support_displaced_stepping] } {
+ lappend disp_step_opts "on"
+ }
+
+ foreach displaced $disp_step_opts {
+ with_test_prefix "displaced $displaced" {
+
+ gdb_test "continue" \
+ "Continuing\\..*Breakpoint \[0-9\]+, (.* in |__libc_|)$syscall \\(\\).*" \
+ "continue to $syscall (3rd time)"
+
+ # Hit the breakpoint on $syscall for the third time.
+ # In this time, we'll set breakpoint on the syscall insn
+ # we recorded previously, and single step over it.
+
+ set syscall_insn_bp 0
+ gdb_test_multiple "break \*$syscall_insn_addr" \
+ "break on syscall insn" {
+ -re "Breakpoint (\[0-9\]*) at .*$gdb_prompt $" {
+ set syscall_insn_bp $expect_out(1,string)
+ pass "break on syscall insns"
+ }
+ }
+
+ gdb_test "continue" \
+ "Continuing\\..*Breakpoint \[0-9\]+, .*" \
+ "continue to syscall insn $syscall"
+
+ gdb_test_no_output "set displaced-stepping $displaced"
+
+ # Check the address of next instruction of syscall.
+ if {[gdb_test "stepi" "x/i .*=>.*" "single step over $syscall"] != 0} {
+ return -1
+ }
+
+ check_pc_after_cross_syscall $syscall $syscall_insn_next_addr
+
+ # Delete breakpoint syscall insns to avoid interference
+ # to other syscalls.
+ gdb_test_no_output "delete $syscall_insn_bp" \
+ "delete break $syscall insn"
+ }
+ }
+
+ with_test_prefix "break cond on target" {
+ set cond_bp_target 1
+
+ set test "set breakpoint condition-evaluation target"
+ gdb_test_multiple $test $test {
+ -re "warning: Target does not support breakpoint condition evaluation.\r\nUsing host evaluation mode instead.\r\n$gdb_prompt $" {
+ # Target doesn't support breakpoint condition
+ # evaluation on its side.
+ set cond_bp_target 0
+ }
+ -re "^$test\r\n$gdb_prompt $" {
+ }
+ }
+
+ if { $cond_bp_target } {
+ gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, (.* in |__libc_|)$syscall \\(\\).*" \
+ "continue to $syscall"
+
+ # Create a breakpoint with the condition which is false.
+ set syscall_insn_bp 0
+ gdb_test_multiple "break \*$syscall_insn_addr if main == 0" \
+ "break on syscall insns" {
+ -re "Breakpoint (\[0-9\]*) at .*$gdb_prompt $" {
+ set syscall_insn_bp $expect_out(1,string)
+ pass "break on syscall insns"
+ }
+ }
+
+ gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, (.* in |__libc_|)$syscall \\(\\).*" \
+ "continue to $syscall again"
+
+ # Delete breakpoint syscall insns to avoid interference to
+ # other syscalls.
+ gdb_test_no_output "delete $syscall_insn_bp" \
+ "delete break $syscall insn"
+ }
+ }
+
+ gdb_test_no_output "delete $syscall_bp" "delete break $syscall"
+
+ gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, marker \\(\\) at.*" \
+ "continue to marker ($syscall)"
+ }
+}
+
+step_over_syscall "fork"
+step_over_syscall "vfork"
diff --git a/gdb/testsuite/gdb.base/step-over-vfork.c b/gdb/testsuite/gdb.base/step-over-vfork.c
new file mode 100644
index 0000000..35665ab
--- /dev/null
+++ b/gdb/testsuite/gdb.base/step-over-vfork.c
@@ -0,0 +1,47 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2011-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 <http://www.gnu.org/licenses/>. */
+
+#include <unistd.h>
+
+static void
+marker () {}
+
+int
+main (void)
+{
+ int i, pid;
+
+ for (i = 0; i < 6; i++)
+ {
+ pid = vfork ();
+ if (pid == -1)
+ {
+ return 1;
+ }
+ else if (pid != 0)
+ {
+ }
+ else
+ {
+ _exit (0);
+ }
+ }
+
+ marker ();
+ return 0;
+
+}
--
1.9.1