Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Yao Qi <qiyaoltc@gmail.com>
To: gdb-patches@sourceware.org
Subject: [PATCH 2/7] Refactor gdb.base/disp-step-syscall.exp for general step over test
Date: Fri, 26 Feb 2016 14:04:00 -0000	[thread overview]
Message-ID: <1456495426-7520-3-git-send-email-yao.qi@linaro.org> (raw)
In-Reply-To: <1456495426-7520-1-git-send-email-yao.qi@linaro.org>

This patch moves some code out of disp_step_cross_syscall to a new proc
check_pc_after_cross_syscall and setup.  Procedure setup is to start a
fresh GDB and compute the syscall instruction address.

gdb/testsuite:

2016-02-26  Yao Qi  <yao.qi@linaro.org>

	* gdb.base/disp-step-syscall.exp (check_pc_after_cross_syscall): New
	proc.
	(setup): New proc.
	(disp_step_cross_syscall): Move code to check_pc_after_cross_syscall
	and setup.
---
 gdb/testsuite/gdb.base/disp-step-syscall.exp | 149 +++++++++++++++------------
 1 file changed, 83 insertions(+), 66 deletions(-)

diff --git a/gdb/testsuite/gdb.base/disp-step-syscall.exp b/gdb/testsuite/gdb.base/disp-step-syscall.exp
index 80cdc3b..a1af3b4 100644
--- a/gdb/testsuite/gdb.base/disp-step-syscall.exp
+++ b/gdb/testsuite/gdb.base/disp-step-syscall.exp
@@ -32,80 +32,105 @@ if { [istarget "i\[34567\]86-*-linux*"] || [istarget "x86_64-*-linux*"] } {
     return -1
 }
 
-proc disp_step_cross_syscall { syscall } {
-    with_test_prefix "$syscall" {
-	global syscall_insn
-	global gdb_prompt
+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
+    }
+}
 
-	set testfile "disp-step-$syscall"
+# Restart GDB and set up the test.  Return a list in which the first one
+# is the address of syscall instruction and the second one is the address
+# of the next instruction address of syscall instruction.  If anything
+# wrong, the two elements of list are -1.
 
-	if [prepare_for_testing ${testfile}.exp ${testfile} ${testfile}.c {debug}] {
-	    untested ${testfile}.exp
-	    return -1
-	}
+proc setup { syscall } {
+    global gdb_prompt syscall_insn
 
-	if { ![runto main] } then {
-	    fail "run to main ($syscall)"
-	    return
-	}
+    set testfile "disp-step-$syscall"
 
-	# Delete the breakpoint on main.
-	gdb_test_no_output "delete break 1"
+    clean_restart $testfile
 
-	gdb_test "break marker" "Breakpoint.*at.* file .*${testfile}.c, line.*"
-	gdb_test_no_output "set displaced-stepping off"
+    if { ![runto main] } then {
+	fail "run to main ($syscall)"
+	return -1
+    }
 
-	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"
-	    }
-	}
+    # Delete the breakpoint on main.
+    gdb_test_no_output "delete break 1"
 
-	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_no_output "set displaced-stepping off"
 
-	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 "break $syscall" "Breakpoint \[0-9\]* at .*"
 
-	gdb_test "display/i \$pc" ".*"
+    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.
 
-	# 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
-		}
+    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, -1 }
+    }
+
+    set syscall_insn_addr [get_hexadecimal_valueof "\$pc" "0"]
+    if {[gdb_test "stepi" "x/i .*=>.*" "stepi $syscall insn"] != 0} {
+	return { -1, -1 }
+    }
+    return [list $syscall_insn_addr [get_hexadecimal_valueof "\$pc" "0"]]
+}
 
-	if {$steps == $max_steps} {
+proc disp_step_cross_syscall { syscall } {
+    with_test_prefix "$syscall" {
+	global syscall_insn
+	global gdb_prompt
+
+	set testfile "disp-step-$syscall"
+
+	if [build_executable ${testfile}.exp ${testfile} ${testfile}.c {debug}] {
+	    untested ${testfile}.exp
 	    return -1
 	}
 
-	set syscall_insn_addr [get_hexadecimal_valueof "\$pc" "0"]
-	if {[gdb_test "stepi" "x/i .*=>.*" "stepi $syscall insn"] != 0} {
+	set ret [setup $syscall]
+
+	set syscall_insn_addr [lindex $ret 0]
+	set syscall_insn_next_addr [lindex $ret 1]
+	if { $syscall_insn_addr == -1 } {
 	    return -1
 	}
-	set syscall_insn_next_addr [get_hexadecimal_valueof "\$pc" "0"]
 
 	gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, (.* in |__libc_|)$syscall \\(\\).*" \
 	    "continue to $syscall (3rd time)"
@@ -120,7 +145,6 @@ proc disp_step_cross_syscall { syscall } {
 		pass "break on syscall insns"
 	    }
 	}
-	gdb_test_no_output "delete $syscall_bp" "delete break $syscall"
 
 	gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, .*" \
 	    "continue to syscall insn $syscall"
@@ -132,19 +156,12 @@ proc disp_step_cross_syscall { syscall } {
 	    return -1
 	}
 
-	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
-	}
+	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"
+	delete_breakpoints
 
+	gdb_test "break marker" "Breakpoint.*at.* file .*${testfile}.c, line.*"
 	gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, marker \\(\\) at.*" \
 	    "continue to marker ($syscall)"
     }
-- 
1.9.1


  parent reply	other threads:[~2016-02-26 14:04 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-19 14:36 [PATCH 0/8] Leave child suspended when step over parent Yao Qi
2016-02-19 14:36 ` [PATCH 4/8] Step over syscalll insn with disp-step on and off Yao Qi
2016-02-25 17:27   ` Pedro Alves
2016-02-19 14:36 ` [PATCH 5/8] Step over fork/vfork syscall insn in gdbserver Yao Qi
2016-02-23 20:28   ` Luis Machado
2016-02-25 17:31   ` Pedro Alves
2016-02-19 14:36 ` [PATCH 3/8] Use loop in disp-step-fork.c and disp-step-vfork.c Yao Qi
2016-02-25 17:28   ` Pedro Alves
2016-02-19 14:37 ` [PATCH 7/8] Rename disp-step-syscall.exp to step-over-syscall.exp Yao Qi
2016-02-25 17:32   ` Pedro Alves
2016-02-19 14:37 ` [PATCH 6/8] Reformat disp-step-syscall.exp Yao Qi
2016-02-19 14:37 ` [PATCH 1/8] [GDBserver] Leave child suspended when step over parent Yao Qi
2016-02-23 20:23   ` Luis Machado
2016-02-25 17:12   ` Pedro Alves
2016-02-19 14:37 ` [PATCH 8/8] New test about step over clone syscall Yao Qi
2016-02-23 20:31   ` Luis Machado
2016-02-25 17:43   ` Pedro Alves
2016-02-25 17:43   ` Pedro Alves
2016-02-26 14:03 ` [PATCH 0/7 V2] Leave child suspended when step over parent Yao Qi
2016-02-26 14:04   ` [PATCH 5/7] Rename disp-step-syscall.exp to step-over-syscall.exp Yao Qi
2016-02-26 14:04   ` [PATCH 7/7] New test about step over clone syscall Yao Qi
2016-02-26 14:04   ` [PATCH 1/7] [GDBserver] Leave child suspended when step over parent Yao Qi
2016-02-26 14:04   ` [PATCH 4/7] Step over fork/vfork syscall insn in gdbserver Yao Qi
2016-02-26 15:02     ` Luis Machado
2016-02-26 15:50       ` Yao Qi
2016-02-26 14:04   ` Yao Qi [this message]
2016-02-26 14:04   ` [PATCH 6/7] Reformat gdb.base/step-over-syscall.exp Yao Qi
2016-02-26 14:04   ` [PATCH 3/7] Step over syscalll insn with disp-step on and off Yao Qi
2016-03-03  9:21   ` [PATCH 0/7 V2] Leave child suspended when step over parent Yao Qi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1456495426-7520-3-git-send-email-yao.qi@linaro.org \
    --to=qiyaoltc@gmail.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox