Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Kevin Buettner <kevinb@redhat.com>
To: Stephan Rohr <stephan.rohr@intel.com>
Cc: gdb-patches@sourceware.org, eliz@gnu.org, guinevere@redhat.com,
	tom@tromey.com
Subject: Re: [PATCH v4 1/1] gdb: remove check for minimal symbols in 'start_command'
Date: Mon, 27 Jan 2025 16:28:30 -0700	[thread overview]
Message-ID: <20250127162830.5d10b4f7@f41-zbm-amd> (raw)
In-Reply-To: <20250127154211.2509613-2-stephan.rohr@intel.com>

On Mon, 27 Jan 2025 07:42:11 -0800
Stephan Rohr <stephan.rohr@intel.com> wrote:

> From: "Rohr, Stephan" <stephan.rohr@intel.com>
> 
> GDB aborts the 'start' command if the minimal symbols cannot be
> resolved.  On Windows, GDB reads the minimal symbols from the COFF
> header of the PE file.  The symbol table is deprecated and the
> number of symbols in the COFF header may be zero:
> 
>   https://learn.microsoft.com/en-us/windows/win32/debug/pe-format
> 
> This is reproducible with clang version 18.1.8 on Windows:
> 
>   clang++ -g -O0 -gdwarf -fuse-ld=lld test.cpp -o test_clang
> 
> The COFF file header shows:
> 
>   FILE HEADER VALUES
>         8664 machine (x64)
>            E number of sections
>     66E889EC time date stamp Mon Sep 16 21:41:32 2024
>        FB400 file pointer to symbol table
>            0 number of symbols
>           F0 size of optional header
>           22 characteristics
> 
> GDB is not able to read the minimal symbols; the `start' command fails
> with an error:
> 
>   (gdb) start
>   No symbol table loaded.  Use the "file" command.
> 
> Manually inserting a breakpoint in main works fine:
> 
>   (gdb) tbreak main
>   Temporary breakpoint 1 at 0x14000100c: file test.cpp, line 6.
>   (gdb) run
>   Starting program: C:\test-clang
> 
>   Temporary breakpoint 1, main () at test.cpp:6
>   6         std::cout << "Hello World.\n";
> 
> Remove the check entirely; a 'NOT_FOUND_ERROR' is thrown if 'main'
> cannot be resolved.  The error is consumed in 'create_breakpoint ()'
> and an error message is displayed to the user.
> ---
>  gdb/infcmd.c | 6 ------
>  1 file changed, 6 deletions(-)
> 
> diff --git a/gdb/infcmd.c b/gdb/infcmd.c
> index b6b21a46b3d..00703e44b7b 100644
> --- a/gdb/infcmd.c
> +++ b/gdb/infcmd.c
> @@ -517,12 +517,6 @@ run_command (const char *args, int from_tty)
>  static void
>  start_command (const char *args, int from_tty)
>  {
> -  /* Some languages such as Ada need to search inside the program
> -     minimal symbols for the location where to put the temporary
> -     breakpoint before starting.  */
> -  if (!have_minimal_symbols (current_program_space))
> -    error (_("No symbol table loaded.  Use the \"file\" command."));
> -
>    /* Run the program until reaching the main procedure...  */
>    run_command_1 (args, from_tty, RUN_STOP_AT_MAIN);
>  }

It's possible to reproduce this behavior on Linux too:

$ gcc -static -g -o hello hello.c
$ strip --keep-section='.debug*' hello

Using a gdb built without this patch:

    (gdb) file hello
    Reading symbols from hello...
    (gdb) start
    No symbol table loaded.  Use the "file" command.

Which demonstrates the behavior that you're fixing with this patch.

And yet...

    (gdb) b main
    Breakpoint 1 at 0x401849: file hello.c, line 6.
    (gdb) run
    Starting program: /home/kev/ctests/hello 

    This GDB supports auto-downloading debuginfo from the following URLs:
      <https://debuginfod.fedoraproject.org/>
    Enable debuginfod for this session? (y or [n]) y
    Debuginfod has been enabled.
    To make this setting permanent, add 'set debuginfod enabled on' to .gdbinit.

    Breakpoint 1, main () at hello.c:6
    6	    printf("Hello world\n");

...it's still possible to set a breakpoint on main and run to it.

With your patch:

(gdb) file hello
Reading symbols from hello...
(gdb) start
Temporary breakpoint 1 at 0x401849: file hello.c, line 6.
Starting program: /home/kev/ctests/hello 

This GDB supports auto-downloading debuginfo from the following URLs:
  <https://debuginfod.fedoraproject.org/>
Enable debuginfod for this session? (y or [n]) y
Debuginfod has been enabled.
To make this setting permanent, add 'set debuginfod enabled on' to .gdbinit.

Temporary breakpoint 1, main () at hello.c:6
6	    printf("Hello world\n");

The one thing that concerns me is the comment regarding the Ada language
and the need to search for minimal symbols.  I'm going to give this patch
an "Approved-by", but please wait a few days for others to weigh in
regarding this concern.

Approved-by: Kevin Buettner <kevinb@redhat.com>


  reply	other threads:[~2025-01-27 23:29 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-01-27 15:42 [PATCH v4 0/1] gdb: remove minimal symbol check " Stephan Rohr
2025-01-27 15:42 ` [PATCH v4 1/1] gdb: remove check for minimal symbols " Stephan Rohr
2025-01-27 23:28   ` Kevin Buettner [this message]
2025-01-28 17:47     ` Tom Tromey
2025-02-10 17:09     ` Guinevere Larsen
2025-02-11 14:51       ` Tom Tromey
2025-02-11 15:53         ` Rohr, Stephan

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=20250127162830.5d10b4f7@f41-zbm-amd \
    --to=kevinb@redhat.com \
    --cc=eliz@gnu.org \
    --cc=gdb-patches@sourceware.org \
    --cc=guinevere@redhat.com \
    --cc=stephan.rohr@intel.com \
    --cc=tom@tromey.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