public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Simon Marchi <simon.marchi@polymtl.ca>
To: Xavier Roirand <roirand@adacore.com>
Cc: gdb-patches@sourceware.org, brobecker@adacore.com
Subject: Re: [RFA 2/5] Darwin: Handle unrelocated dyld.
Date: Wed, 22 Aug 2018 13:55:00 -0000	[thread overview]
Message-ID: <18e995c1bee8c82df212dd431136d259@polymtl.ca> (raw)
In-Reply-To: <1534932677-9496-3-git-send-email-roirand@adacore.com>

On 2018-08-22 06:11, Xavier Roirand wrote:
> On Darwin, debugging an helloworld program with GDB does
> not work and ends with:
> 
>   (gdb) set startup-with-shell off
>   (gdb) start
>   Temporary breakpoint 1 at 0x100000fb4: file /tmp/helloworld.c, line 
> 1.
>   Starting program: /private/tmp/helloworld
>   [New Thread 0x2703 of process 18906]
>   [New Thread 0x2603 of process 18906]
> 
>   [1]+  Stopped                 ./gdb/gdb /tmp/helloworld
> 
> When debugging with lldb, instead of having the STOP signal, we can
> see that a breakpoint is not set to a proper location:
> 
>   Warning:
>   Cannot insert breakpoint -1.
>   Cannot access memory at address 0xf726
> 
>   Command aborted.
> 
> The inserted breakpoint is the one used when GDB has to stop the target
> when a shared library is loaded or unloaded. The notifier address used
> for adding the breakpoint is wrong thus the above failure.
> This notifier address is an offset relative to dyld base address, so
> the value calculation has to be updated to reflect this.
> This patch fix this.

We just got a Mac at work, so I started to toy with GDB on it yesterday, 
this is one of the first problem I got.  I also had the intuition that 
the address of that breakpoint was wrong, so I patched GDB to add a 
fixed 0x100000000, and that made it work.

With this patch, there seems to be two way the notifier breakpoint can 
be set: in darwin_solib_create_inferior_hook and in 
darwin_handle_solib_event.  Can you explain why do we need both?

In particular, I don't understand when the one in 
darwin_handle_solib_event can be useful.  There are two ways 
darwin_handle_solib_event can be called:

  - By bpstat_stop_status in breakpoint.c.  For this to happen, we need 
to hit a breakpoint of type bp_shlib_event. If we have such a 
breakpoint, it means we already have set our notifier breakpoint, so why 
would we need to set it again?
  - By handle_inferior_event_1 if ecs->ws.kind is TARGET_WAITKIND_LOADED. 
  darwin-nat.c never seems to report this stop kind.

> diff --git a/gdb/solib-darwin.c b/gdb/solib-darwin.c
> index ed8e0c1..aad3c44 100644
> --- a/gdb/solib-darwin.c
> +++ b/gdb/solib-darwin.c
> @@ -77,6 +77,9 @@ struct darwin_info
> 
>    /* Gdb copy of dyld_all_info_infos.  */
>    struct gdb_dyld_all_image_infos all_image;
> +
> +  /* True when a breakpoint has been added on dyld notifier.  */
> +  unsigned int notifier_set;

Use bool?

Also, from what I understand from the rest of the patch (I might be 
wrong), this is also set if we have tried to add it but failed (because 
we failed to get info about the dynamic loader, for example).  If this 
is right, can you update the comment to reflect this?

>  };
> 
>  /* Per-program-space data key.  */
> @@ -432,20 +435,19 @@ gdb_bfd_mach_o_fat_extract (bfd *abfd, bfd_format 
> format,
>  /* Extract dyld_all_image_addr when the process was just created, 
> assuming the
>     current PC is at the entry of the dynamic linker.  */
> 
> -static void
> -darwin_solib_get_all_image_info_addr_at_init (struct darwin_info 
> *info)
> +static gdb_bfd_ref_ptr
> +darwin_get_dyld_bfd (void)

The comment above the function would need to be updated.

>  {
>    char *interp_name;
> -  CORE_ADDR load_addr = 0;
> 
>    /* This method doesn't work with an attached process.  */
>    if (current_inferior ()->attach_flag)
> -    return;
> +    return NULL;

Should this last snippet (check for attach_flag) be here or in 
darwin_solib_get_all_image_info_addr_at_init?  From what I understand, 
there is nothing preventing darwin_get_dyld_bfd to work when working 
with an attached process.

> 
>    /* Find the program interpreter.  */
>    interp_name = find_program_interpreter ();
>    if (!interp_name)
> -    return;
> +    return NULL;
> 
>    /* Create a bfd for the interpreter.  */
>    gdb_bfd_ref_ptr dyld_bfd (gdb_bfd_open (interp_name, gnutarget, 
> -1));
> @@ -459,6 +461,18 @@ darwin_solib_get_all_image_info_addr_at_init
> (struct darwin_info *info)
>        else
>  	dyld_bfd.release ();
>      }
> +  return dyld_bfd;
> +}
> +
> +/* Extract dyld_all_image_addr when the process was just created, 
> assuming the
> +   current PC is at the entry of the dynamic linker.  */
> +
> +static void
> +darwin_solib_get_all_image_info_addr_at_init (struct darwin_info 
> *info)
> +{
> +  CORE_ADDR load_addr = 0;
> +  gdb_bfd_ref_ptr dyld_bfd (darwin_get_dyld_bfd ());
> +
>    if (dyld_bfd == NULL)
>      return;
> 
> @@ -502,6 +516,37 @@ darwin_solib_read_all_image_info_addr (struct
> darwin_info *info)
>    info->all_image_addr = extract_unsigned_integer (buf, len, 
> BFD_ENDIAN_BIG);
>  }
> 
> +/* Callback called on solib event.
> +   Used when a breakpoint has to be added on the entry point, to wait 
> for
> +   dyld initialization.  */
> +
> +static void
> +darwin_handle_solib_event (void)
> +{
> +  struct darwin_info *info = get_darwin_info ();
> +
> +  /* Nothing to do if notifier was already set.  */
> +  if (info->notifier_set)
> +    return;
> +  info->notifier_set = 1;
> +
> +  /* Remove breakpoint on entry, but not now (as our caller is 
> iterating on
> +     breakpoints).  */
> +  remove_solib_event_breakpoints_at_next_stop ();
> +
> +  /* Reload dyld infos.  */
> +  darwin_load_image_infos (info);
> +
> +  if (info->all_image.count == 0)
> +    {
> +      /* Not expected: no dylibs.  */
> +      return;
> +    }
> +
> +  /* Insert the real solib event on the dyld notifier.  */
> +  create_solib_event_breakpoint (target_gdbarch (), 
> info->all_image.notifier);
> +}
> +
>  /* Shared library startup support.  See documentation in solib-svr4.c. 
>  */
> 
>  static void
> @@ -509,6 +554,7 @@ darwin_solib_create_inferior_hook (int from_tty)
>  {
>    struct darwin_info *info = get_darwin_info ();
>    CORE_ADDR load_addr;
> +  CORE_ADDR notifier;

Style nit: you can declare variables where you are using them the first 
time.

Simon

  reply	other threads:[~2018-08-22 13:55 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-22 10:11 [RFA 0/5] Fix some bugs on macOS Xavier Roirand
2018-08-22 10:11 ` [RFA 1/5] Darwin: fix bad loop incrementation Xavier Roirand
2018-08-22 13:14   ` Simon Marchi
2018-08-23 15:21     ` Simon Marchi
2018-08-22 10:11 ` [RFA 3/5] Darwin: set startup-with-shell to off on Sierra and later Xavier Roirand
2018-08-22 14:20   ` Simon Marchi
2018-08-22 14:37     ` Pedro Alves
2018-09-03 13:23     ` Xavier Roirand
2018-09-17 19:31   ` Tom Tromey
2018-08-22 10:11 ` [RFA 5/5] Darwin: fix SIGTRAP when debugging Xavier Roirand
2018-08-22 14:34   ` Simon Marchi
2018-08-22 10:11 ` [RFA 2/5] Darwin: Handle unrelocated dyld Xavier Roirand
2018-08-22 13:55   ` Simon Marchi [this message]
2018-09-18 21:22     ` Tom Tromey
2018-09-19 13:41       ` Joel Brobecker
2018-09-19 14:16         ` Simon Marchi
2018-09-19 14:28           ` Joel Brobecker
2018-09-19 14:36         ` Tom Tromey
2018-09-19 14:44           ` Simon Marchi
2018-09-19 15:32             ` Joel Brobecker
2018-09-19 19:15             ` Tom Tromey
2018-09-19 19:50               ` Simon Marchi
2018-09-28 13:31               ` Xavier Roirand
2018-09-28 17:22                 ` Tom Tromey
2018-08-22 13:59   ` Simon Marchi
2018-09-18 21:23     ` Tom Tromey
2018-08-22 10:11 ` [RFA 4/5] Darwin: fix thread ptid started by fork_inferior Xavier Roirand
2018-08-22 14:30   ` Simon Marchi
2018-08-22 16:10   ` Pedro Alves
2018-08-22 18:14     ` Simon Marchi
2018-09-18 21:01   ` Tom Tromey
2018-09-17 20:57 ` [RFA 0/5] Fix some bugs on macOS Tom Tromey
2018-09-17 21:25   ` Joel Brobecker
2018-09-17 23:03     ` Tom Tromey

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=18e995c1bee8c82df212dd431136d259@polymtl.ca \
    --to=simon.marchi@polymtl.ca \
    --cc=brobecker@adacore.com \
    --cc=gdb-patches@sourceware.org \
    --cc=roirand@adacore.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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).