Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Tom de Vries via Gdb-patches <gdb-patches@sourceware.org>
To: Simon Marchi <simon.marchi@efficios.com>,
	Simon Marchi <simon.marchi@polymtl.ca>,
	John Baldwin <jhb@FreeBSD.org>,
	gdb-patches@sourceware.org
Subject: Re: [PATCH 6/6] gdb: don't share aspace/pspace on fork with "detach-on-fork on" and "follow-fork-mode child"
Date: Wed, 29 Sep 2021 00:38:01 +0200	[thread overview]
Message-ID: <a7c43451-002f-eb63-8f22-eac4abcaaba4@suse.de> (raw)
In-Reply-To: <d7ae1038-4ae2-20cd-b8e7-eb5cf66ab706@efficios.com>

On 9/28/21 9:12 PM, Simon Marchi wrote:
> 
> 
> On 2021-09-28 11:10, Tom de Vries wrote:
>> On 9/27/21 9:32 PM, Simon Marchi via Gdb-patches wrote:
>>> On 2021-09-10 23:16, Simon Marchi via Gdb-patches wrote:
>>>>>> Note that the problem described above happens today with "detach-on-fork
>>>>>> off" and "follow-fork-mode child", because we create new spaces for the
>>>>>> child.  This will have to be addressed later.
>>>>>>
>>>>>> Test-wise, improve gdb.base/foll-fork.exp to set a breakpoint that is
>>>>>> expected to have a location in each inferiors.  Without the fix, when
>>>>>> the two inferiors erroneously share a program space, GDB reports a
>>>>>> single location.
>>>>>
>>>>> So I wonder about the case where follow-fork-mode is parent and
>>>>> detach-on-fork is off?  In that case, should the existing aspace/pspace
>>>>> stay with the parent and the child get clones?  That is, using the
>>>>> follow-fork-mode setting to determine which inferior gets the existing
>>>>> aspace/pspace and assigning the cloned copies to the !follow-fork-mode
>>>>> inferior?
>>>>
>>>> I think that would work, to address the problem described above.
>>>
>>> FYI, I tried doing the above (giving the original program space to the
>>> child with "follow-fork-mode child" and "detach-on-fork off") and I hit
>>> some problems.  Attached to the program space is the list of shared
>>> libraries.  So GDB would now think the parent has no shared library.  I
>>> added a solib_create_inferior_hook call to force re-discovering the
>>> shared libraries in the parent.  That seemed to work, but then in MI
>>> there were spurious =library-loaded events that made it look like
>>> inferior 1 re-loaded shared libraries.  I'm also worried about what
>>> other per-program space is kept, that could cause some kind of trouble
>>> for the parent.  So I will put this off for now, as it's not something
>>> that should be done in a rush, I think.
>>>
>>> In the mean time, I'll re-test this series and push it if all seems
>>> good.
>>
>> I'm seeing:
>> ...
>> (gdb) PASS: gdb.base/foll-fork.exp: follow-fork-mode=child:
>> detach-on-fork=on: cmd=next 2: test_follow_fork: break callee
>> info breakpoints 2^M
>> Num     Type           Disp Enb Address            What^M
>> 2       breakpoint     keep y   <MULTIPLE>         ^M
>> 2.1                         y   0x00000000004005ae in callee at
>> /home/vries/gdb_versions/devel/src/gdb/testsuite/gdb.base/foll-fork.c:9
>> inf 2^M
>> 2.2                         y   0x00000000004005ae in callee at
>> /home/vries/gdb_versions/devel/src/gdb/testsuite/gdb.base/foll-fork.c:9
>> inf 1^M
>> (gdb) FAIL: gdb.base/foll-fork.exp: follow-fork-mode=child:
>> detach-on-fork=on: cmd=next 2: test_follow_fork: info breakpoints
>> ...
>>
>> Looks like the test-case expects first inf 1, then inf 2, and this is
>> the other way around.
>>
>> Should the test-case regexp be updated?
> 
> Huh, I remember that have encountered this, and thought I had changed
> the regexp to allow both orders.  I must have lost that change.  But it
> still bugged me, why did I see one order sometimes and the other at
> other times.
> 
> On my home computer (Arch Linux) I see "2, 1" and on my work computer
> (Ubuntu 20.04) I see "1, 2".  So that lets me compare both cases.  The
> order comes from the SALs passed to init_breakpoint_sal.  It comes from
> the compare_symbols function here:
> 
>   https://gitlab.com/gnutools/binutils-gdb/-/blob/3a6a0158ee07ba2f960ae4a898897460382dc5ec/gdb/linespec.c#L3568-3592
> 
> It compares the value of program_space pointers to determine the order
> of symbols, so that can explain the difference between two machines.
> 
> That then decides the order of the locations in the breakpoint::loc
> list, since add_location_to_breakpoint only sorts by address.  So
> depending on which location is added first, it will give different
> orders.
> 

Ack.

> I think that the order of locations should be as stable as possible. > I
> started writing a patch for that, but then realized that even then, the
> order in the test could vary, based on the architecture, whether you use
> PIE or not, etc.  And in the end the order doesn't really matter, what
> is important is that we have two locations.
> 
> Having a more stable breakpoint location order would be nice, but not as
> a way to fix this test failure.
> 

Agreed.

> So, what do you think of the patch below?  The regexp accepts (1|2) for
> both lines.  If you have a simple way to say "either 1 then 2 or 2 then
> 1" (so that it rejects 1 then 1 or 2 then 2), I would take it, but
> otherwise I think this is sufficient.
> 

FWIW, I prefer Pedro's gdb_assert variant, which is a bit more strict
thank this one, and takes the or-ing out the regexp domain.

Thanks,
- Tom


> From 38f41f929f46926fede29c70064871fc23e0e215 Mon Sep 17 00:00:00 2001
> From: Simon Marchi <simon.marchi@polymtl.ca>
> Date: Tue, 28 Sep 2021 13:22:53 -0400
> Subject: [PATCH] gdb.base/foll-fork.exp: accept "info breakpoints" output in
>  any order
> 
> The test currently requires the "inf 1" breakpoint to be before the "inf
> 2" breakpoint.  This is not always the case:
> 
>     info breakpoints 2
>     Num     Type           Disp Enb Address            What
>     2       breakpoint     keep y   <MULTIPLE>
>     2.1                         y   0x0000555555554730 in callee at /home/simark/src/binutils-gdb/gdb/testsuite/gdb.base/foll-fork.c:9 inf 2
>     2.2                         y   0x0000555555554730 in callee at /home/simark/src/binutils-gdb/gdb/testsuite/gdb.base/foll-fork.c:9 inf 1
>     (gdb) FAIL: gdb.base/foll-fork.exp: follow-fork-mode=parent: detach-on-fork=off: cmd=next 2: test_follow_fork: info breakpoints
> 
> Since add_location_to_breakpoint uses only the address as a criterion to
> sort locations, the order of locations at the same address is not
> stable: it will depend on the insertion order.  Here, the insertion
> order comes from the order of SALs when creating the breakpoint, which
> can vary from machine to machine.  While it would be more user-friendly
> to have a more stable order for printed breakpoint locations, it doesn't
> really matter for this test, and it would be hard to define an order
> that will be the same everywhere, all the time.
> 
> So, loosen the regexp to not check the "inf 1" vs "inf 2" order.
> 
> Change-Id: I5ada2e0c6ad0669e0d161bfb6b767229c0970d16
> ---
>  gdb/testsuite/gdb.base/foll-fork.exp | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/gdb/testsuite/gdb.base/foll-fork.exp b/gdb/testsuite/gdb.base/foll-fork.exp
> index 7f9e1cf87c6a..c0beb089d451 100644
> --- a/gdb/testsuite/gdb.base/foll-fork.exp
> +++ b/gdb/testsuite/gdb.base/foll-fork.exp
> @@ -195,8 +195,8 @@ proc_with_prefix test_follow_fork { follow-fork-mode detach-on-fork cmd } {
>  	}
>  	gdb_test "info breakpoints $bpnum" \
>  	    [multi_line \
> -		"$bpnum\\.1 .* inf 1" \
> -		"$bpnum\\.2 .* inf 2"] \
> +		"$bpnum\\.1 .* inf (1|2)" \
> +		"$bpnum\\.2 .* inf (1|2)"] \
>  	    "info breakpoints"
>      }
>  }
> 

  parent reply	other threads:[~2021-09-28 22:38 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-10 20:53 [PATCH 1/6] gdb.base/foll-fork.exp: remove DUPLICATEs Simon Marchi via Gdb-patches
2021-09-10 20:53 ` [PATCH 2/6] gdb.base/foll-fork.exp: remove gating based on target triplet Simon Marchi via Gdb-patches
2021-09-10 20:53 ` [PATCH 3/6] gdb.base/foll-fork.exp: refactor to restart GDB between each portion of the test Simon Marchi via Gdb-patches
2021-09-10 20:54 ` [PATCH 4/6] gdb.base/foll-fork.exp: rename variables Simon Marchi via Gdb-patches
2021-09-10 20:54 ` [PATCH 5/6] gdb.base/foll-fork.exp: use foreach_with_prefix to handle prefixes Simon Marchi via Gdb-patches
2021-09-10 20:54 ` [PATCH 6/6] gdb: don't share aspace/pspace on fork with "detach-on-fork on" and "follow-fork-mode child" Simon Marchi via Gdb-patches
2021-09-10 23:33   ` John Baldwin
2021-09-11  3:16     ` Simon Marchi via Gdb-patches
2021-09-11 13:02       ` Simon Marchi via Gdb-patches
2021-09-11 13:03         ` Simon Marchi via Gdb-patches
2021-09-27 19:32       ` Simon Marchi via Gdb-patches
2021-09-28 15:10         ` Tom de Vries via Gdb-patches
2021-09-28 19:12           ` Simon Marchi via Gdb-patches
2021-09-28 19:31             ` Pedro Alves
2021-09-28 19:35               ` Pedro Alves
2021-09-28 23:32                 ` Simon Marchi via Gdb-patches
2021-09-28 22:38             ` Tom de Vries via Gdb-patches [this message]
2021-09-23 19:23 ` [PATCH 1/6] gdb.base/foll-fork.exp: remove DUPLICATEs Pedro Alves

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=a7c43451-002f-eb63-8f22-eac4abcaaba4@suse.de \
    --to=gdb-patches@sourceware.org \
    --cc=jhb@FreeBSD.org \
    --cc=simon.marchi@efficios.com \
    --cc=simon.marchi@polymtl.ca \
    --cc=tdevries@suse.de \
    /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