Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Yao Qi <qiyaoltc@gmail.com>
To: Pedro Alves <palves@redhat.com>
Cc: Yao Qi <qiyaoltc@gmail.com>,  gdb-patches@sourceware.org
Subject: Re: [PATCH 04/12] Delete reinsert breakpoints from forked child
Date: Tue, 14 Jun 2016 11:17:00 -0000	[thread overview]
Message-ID: <86porkt3yy.fsf@gmail.com> (raw)
In-Reply-To: <f5c12eca-f7f4-c953-bbb6-469e6b8cc8c5@redhat.com> (Pedro Alves's	message of "Mon, 13 Jun 2016 18:29:26 +0100")

Pedro Alves <palves@redhat.com> writes:

>> I can't find another way to show the previous instruction.
>
> Now that the negative repeat count for 'x' patch [1] is in,
> you can just do "x/-i $pc".  Maybe "disassemble" could learn
> to find boundaries similarly.  
>
> But that x/-i trick only works if the code has line info available,
> which you won't for _exit, unless you have debug info for glibc
> installed.  Maybe better is to just do "disassemble", with no args,
> which disassembles the whole function.

Yes, "disassemble" without args can do that.

>
> Or do it like step-over-syscall.exp does.
>
> [1] https://sourceware.org/ml/gdb-patches/2016-06/msg00021.html
>

I tried to avoid that approach in step-over-syscall.exp, because it may
take so many instructions to single-step from fork () to the syscall
instruction (due to spin lock in the execution path, I suspect), and
test takes too long.  I'll fix step-over-syscall.exp separately.

>>> I'm thinking that it might be good for these tests to also have
>>> a displaced-stepping on/off test axis.  Or better still:
>>>
>>>  out-of-line-step-over-bp / in-line-step-over-bp / plain-single-step
>>>
>> 
>> What is difference between the second one and third one?  
>
> As I mention in the quoted sentence below, the last one
> would single-step the instruction with no breakpoint
> installed.  The second one would have a breakpoint at PC,
> which forces a step-over operation.  With displaced step
> off, that'd be an in-line step over.  Thus the second one stops
> all threads (and thus requires restarting them), while the
> third one doesn't.
>
>> I think
>> they've already covered by gdb.base/step-over-syscall.exp.
>
> In that case, shouldn't we be extending that test instead?

OK, I extend step-over-syscall.exp by setting different
combinations of follow-fork and detach-on-fork modes, and it still can
trigger GDBserver internal errors.  How about the patch below?  It
should be patch 5.5, after the bug fix patches (4 and 5) in this series.

-- 
Yao (齐尧)

From a48fbab0961b5112bafd199f0ad298715a5e8eff Mon Sep 17 00:00:00 2001
From: Yao Qi <yao.qi@linaro.org>
Date: Tue, 14 Jun 2016 11:32:01 +0100
Subject: [PATCH] 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-14  Yao Qi  <yao.qi@linaro.org>

	* 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/gdb.base/step-over-syscall.exp b/gdb/testsuite/gdb.base/step-over-syscall.exp
index 7e5a719..2809004 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,21 @@ 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.
+		    break_cond_on_syscall $syscall ${follow-fork} ${detach-on-fork}
+		}
+	    }
+	}
+    }
 }


  reply	other threads:[~2016-06-14 11:17 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-02  9:31 [PATCH 00/12 V2] Use reinsert breakpoint for vCont;s Yao Qi
2016-06-02  9:31 ` [PATCH 01/12] Switch to current thread in finish_step_over Yao Qi
2016-06-13 14:25   ` Pedro Alves
2016-06-02  9:31 ` [PATCH 09/12] Make reinsert_breakpoint thread specific Yao Qi
     [not found]   ` <71a5322e-41e3-9e23-df73-e14b14c1d656@redhat.com>
2016-06-14 12:52     ` Yao Qi
2016-06-14 12:57       ` Pedro Alves
2016-06-02  9:31 ` [PATCH 08/12] Refactor clone_all_breakpoints Yao Qi
2016-06-13 15:14   ` Pedro Alves
2016-06-02  9:31 ` [PATCH 07/12] Create sub classes of 'struct breakpoint' Yao Qi
2016-06-13 15:09   ` Pedro Alves
2016-06-02  9:31 ` [PATCH 03/12] Step over exit with reinsert breakpoints Yao Qi
2016-06-13 14:37   ` Pedro Alves
2016-06-13 14:52     ` Yao Qi
2016-06-13 15:01       ` Pedro Alves
2016-06-17  9:50         ` Yao Qi
2016-06-02  9:31 ` [PATCH 06/12] Pass breakpoint type in set_breakpoint_at Yao Qi
2016-06-13 15:07   ` Pedro Alves
2016-06-02  9:31 ` [PATCH 05/12] Handle reinsert breakpoints for vforked child Yao Qi
2016-06-13 15:07   ` Pedro Alves
2016-06-02  9:31 ` [PATCH 10/12] Switch current_thread to lwp's thread in install_software_single_step_breakpoints Yao Qi
2016-06-13 15:26   ` Pedro Alves
2016-06-02  9:31 ` [PATCH 12/12] Support vCont s and S actions with software single step Yao Qi
2016-06-13 15:56   ` Pedro Alves
2016-06-02  9:31 ` [PATCH 04/12] Delete reinsert breakpoints from forked child Yao Qi
2016-06-13 15:02   ` Pedro Alves
2016-06-13 16:53     ` Yao Qi
2016-06-13 17:29       ` Pedro Alves
2016-06-14 11:17         ` Yao Qi [this message]
2016-06-14 11:40           ` Pedro Alves
2016-06-17  9:53             ` Yao Qi
2016-06-02  9:31 ` [PATCH 02/12] More assert checks on reinsert breakpoint Yao Qi
2016-06-13 14:25   ` Pedro Alves
2016-06-02  9:31 ` [PATCH 11/12] Use reinsert_breakpoint for vCont;s Yao Qi
2016-06-13 15:55   ` Pedro Alves
2016-06-14 13:14     ` Yao Qi
2016-06-14 15:48       ` Pedro Alves
2016-06-15 16:41         ` Yao Qi
2016-06-17 15:10           ` Pedro Alves
2016-06-20 18:09             ` Antoine Tremblay

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=86porkt3yy.fsf@gmail.com \
    --to=qiyaoltc@gmail.com \
    --cc=gdb-patches@sourceware.org \
    --cc=palves@redhat.com \
    /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