public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Tom de Vries <tdevries@suse.de>
To: Guinevere Larsen <blarsen@redhat.com>,
	Andrew Burgess <aburgess@redhat.com>,
	gdb-patches@sourceware.org
Cc: Simon Marchi <simark@simark.ca>, Eli Zaretskii <eliz@gnu.org>
Subject: Re: [PATCH v3] gdb: Change "list ." command's error when no debuginfo is available
Date: Fri, 10 May 2024 08:26:34 +0200	[thread overview]
Message-ID: <254a57c9-1f2d-4eec-a68b-14bf62e77ce6@suse.de> (raw)
In-Reply-To: <6a823587-9b51-47f3-b1df-d7626f65e4dc@redhat.com>

On 5/8/24 19:13, Guinevere Larsen wrote:
> On 5/8/24 11:25, Andrew Burgess wrote:
>> Guinevere Larsen <blarsen@redhat.com> writes:
>>
>>> From: Simon Marchi <simark@simark.ca>
>>>
>>> Currently, when a user tries to list the current location, there are 2
>>> different error messages that can happen, either:
>>>
>>>      (gdb) list .
>>>      No symbol table is loaded.  Use the "file" command.
>>> or
>>>      (gdb) list .
>>>      No debug information available to print source lines.
>>>
>>> The difference here is if gdb can find any symtabs at all or not, which
>>> is not something too important for end-users - and isn't informative at
>>> all. This commit changes it so that the error always says that there
>>> isn't debug information available, with these two variants:
>>>
>>>      (gdb) list .
>>>      Insufficient debug info for showing source lines at current PC 
>>> (0x55555555511d).
>>> or
>>>      (gdb) list .
>>>      Insufficient debug info for showing source lines at default 
>>> location.
>>>
>>> The difference now is if the inferior has started already, which is
>>> controlled by the user and may be useful.
>>>
>>> Unfortunately, it isn't as easy to differentiate if the symtab found for
>>> other list parameters is correct, so other invocations, such as "list +"
>>> still retain their original error message.
>>>
>>> Co-Authored-By: Simon Marchi <simark@simark.ca>
>>> Reviewed-By: Eli Zaretskii <eliz@gnu.org>
>>> ---
>>> Changes for v3:
>>>    Changed error message to use Eli's suggestion
>>>    Added Eli's RB tag since he approved documentation changes
>>>
>>> Changes for v2:
>>>    Added NEWS entry, should have done that from the start oops.
>>>    Added test. This test aims to roughly recreate a situation where the
>>>      current function is in a spot with no debuginfo, and being called
>>>      from somewhere that has debuginfo.
>>>
>>> ---
>>>   gdb/NEWS                                      |  6 ++
>>>   gdb/cli/cli-cmds.c                            | 47 +++++++++----
>>>   .../gdb.base/list-dot-nodebug-extra.c         | 24 +++++++
>>>   gdb/testsuite/gdb.base/list-dot-nodebug.c     | 33 +++++++++
>>>   gdb/testsuite/gdb.base/list-dot-nodebug.exp   | 67 +++++++++++++++++++
>>>   5 files changed, 163 insertions(+), 14 deletions(-)
>>>   create mode 100644 gdb/testsuite/gdb.base/list-dot-nodebug-extra.c
>>>   create mode 100644 gdb/testsuite/gdb.base/list-dot-nodebug.c
>>>   create mode 100644 gdb/testsuite/gdb.base/list-dot-nodebug.exp
>>>
>>> diff --git a/gdb/NEWS b/gdb/NEWS
>>> index feb3a37393a..99909414796 100644
>>> --- a/gdb/NEWS
>>> +++ b/gdb/NEWS
>>> @@ -36,6 +36,12 @@ set unwindonsignal on|off
>>>   show unwindonsignal
>>>     These commands are now aliases for the new set/show 
>>> unwind-on-signal.
>>> +list .
>>> +  When using the command "list ." in a location that has no debug 
>>> information
>>> +  or no file loaded, GDB now says that there is no debug information 
>>> to print
>>> +  lines.  This makes it more obvious that there is no information, 
>>> as opposed
>>> +  to implying there is no inferior loaded.
>>> +
>>>   * New commands
>>>   info missing-debug-handler
>>> diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c
>>> index 3afe2178199..ee3318d7910 100644
>>> --- a/gdb/cli/cli-cmds.c
>>> +++ b/gdb/cli/cli-cmds.c
>>> @@ -1235,37 +1235,39 @@ list_command (const char *arg, int from_tty)
>>>     /* Pull in the current default source line if necessary.  */
>>>     if (arg == NULL || ((arg[0] == '+' || arg[0] == '-' || arg[0] == 
>>> '.') && arg[1] == '\0'))
>>>       {
>>> -      set_default_source_symtab_and_line ();
>>> -      symtab_and_line cursal = get_current_source_symtab_and_line ();
>>> -
>>>         /* If this is the first "list" since we've set the current
>>>        source line, center the listing around that line.  */
>>>         if (get_first_line_listed () == 0 && (arg == nullptr || 
>>> arg[0] != '.'))
>>>       {
>>> -      list_around_line (arg, cursal);
>>> +      set_default_source_symtab_and_line ();
>>> +      list_around_line (arg, get_current_source_symtab_and_line ());
>>>       }
>>>         /* "l" and "l +" lists the next few lines, unless we're 
>>> listing past
>>>        the end of the file.  */
>>>         else if (arg == nullptr || arg[0] == '+')
>>>       {
>>> +      set_default_source_symtab_and_line ();
>>> +      const symtab_and_line cursal = 
>>> get_current_source_symtab_and_line ();
>>>         if (last_symtab_line (cursal.symtab) >= cursal.line)
>>>           print_source_lines (cursal.symtab,
>>>                   source_lines_range (cursal.line), 0);
>>>         else
>>> -        {
>>> -          error (_("End of the file was already reached, use \"list 
>>> .\" to"
>>> -               " list the current location again"));
>>> -        }
>>> +        error (_("End of the file was already reached, use \"list 
>>> .\" to"
>>> +             " list the current location again"));
>>>       }
>>>         /* "l -" lists previous ten lines, the ones before the ten just
>>>        listed.  */
>>>         else if (arg[0] == '-')
>>>       {
>>> +      set_default_source_symtab_and_line ();
>>> +      const symtab_and_line cursal = 
>>> get_current_source_symtab_and_line ();
>>> +
>>>         if (get_first_line_listed () == 1)
>>>           error (_("Already at the start of %s."),
>>>              symtab_to_filename_for_display (cursal.symtab));
>>> +
>>>         source_lines_range range (get_first_line_listed (),
>>>                       source_lines_range::BACKWARD);
>>>         print_source_lines (cursal.symtab, range, 0);
>>> @@ -1274,25 +1276,42 @@ list_command (const char *arg, int from_tty)
>>>         /* "list ." lists the default location again.  */
>>>         else if (arg[0] == '.')
>>>       {
>>> +      std::optional<const symtab_and_line> cursal;
>>>         if (target_has_stack ())
>>>           {
>>>             /* Find the current line by getting the PC of the currently
>>>            selected frame, and finding the line associated to it.  */
>>>             frame_info_ptr frame = get_selected_frame (nullptr);
>>>             CORE_ADDR curr_pc = get_frame_pc (frame);
>>> -          cursal = find_pc_line (curr_pc, 0);
>>> +          cursal.emplace (find_pc_line (curr_pc, 0));
>>> +
>>> +          if (cursal->symtab == nullptr)
>>> +        error
>>> +          (_("Insufficient debug info for showing source lines at "
>>> +             "current PC (%s)."), paddress (get_frame_arch (frame),
>>> +                            curr_pc));
>>>           }
>>>         else
>>>           {
>>>             /* The inferior is not running, so reset the current source
>>>            location to the default (usually the main function).  */
>>>             clear_current_source_symtab_and_line ();
>>> -          set_default_source_symtab_and_line ();
>>> -          cursal = get_current_source_symtab_and_line ();
>>> +          try
>>> +        {
>>> +          set_default_source_symtab_and_line ();
>>> +        }
>>> +          catch (const gdb_exception &e)
>>> +        {
>>> +          error (_("Insufficient debug info for showing source "
>>> +               "lines at default location"));
>>> +        }
>>> +          cursal.emplace (get_current_source_symtab_and_line ());
>>> +
>>> +          gdb_assert (cursal->symtab != nullptr);
>>>           }
>>> -      if (cursal.symtab == nullptr)
>>> -        error (_("No debug information available to print source 
>>> lines."));
>>> -      list_around_line (arg, cursal);
>>> +
>>> +      list_around_line (arg, *cursal);
>>> +
>>>         /* Set the repeat args so just pressing "enter" after using 
>>> "list ."
>>>            will print the following lines instead of the same lines 
>>> again. */
>>>         if (from_tty)
>>> diff --git a/gdb/testsuite/gdb.base/list-dot-nodebug-extra.c 
>>> b/gdb/testsuite/gdb.base/list-dot-nodebug-extra.c
>>> new file mode 100644
>>> index 00000000000..c3d2416e70d
>>> --- /dev/null
>>> +++ b/gdb/testsuite/gdb.base/list-dot-nodebug-extra.c
>>> @@ -0,0 +1,24 @@
>>> +/* This testcase is part of GDB, the GNU debugger.
>>> +
>>> +   Copyright 2024 Free Software Foundation, Inc.
>>> +
>>> +   This program is free software; you can redistribute it and/or modify
>>> +   it under the terms of the GNU General Public License as published by
>>> +   the Free Software Foundation; either version 3 of the License, or
>>> +   (at your option) any later version.
>>> +
>>> +   This program is distributed in the hope that it will be useful,
>>> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
>>> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>> +   GNU General Public License for more details.
>>> +
>>> +   You should have received a copy of the GNU General Public License
>>> +   along with this program.  If not, see 
>>> <http://www.gnu.org/licenses/>.  */
>>> +
>>> +extern void bar(int *);
>> Space missing after 'bar' here.
>>
>>> +
>>> +void
>>> +foo (int *x)
>>> +{
>>> +  bar (x);
>>> +}
>>> diff --git a/gdb/testsuite/gdb.base/list-dot-nodebug.c 
>>> b/gdb/testsuite/gdb.base/list-dot-nodebug.c
>>> new file mode 100644
>>> index 00000000000..b37c3561c41
>>> --- /dev/null
>>> +++ b/gdb/testsuite/gdb.base/list-dot-nodebug.c
>>> @@ -0,0 +1,33 @@
>>> +/* This testcase is part of GDB, the GNU debugger.
>>> +
>>> +   Copyright 2024 Free Software Foundation, Inc.
>>> +
>>> +   This program is free software; you can redistribute it and/or modify
>>> +   it under the terms of the GNU General Public License as published by
>>> +   the Free Software Foundation; either version 3 of the License, or
>>> +   (at your option) any later version.
>>> +
>>> +   This program is distributed in the hope that it will be useful,
>>> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
>>> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>> +   GNU General Public License for more details.
>>> +
>>> +   You should have received a copy of the GNU General Public License
>>> +   along with this program.  If not, see 
>>> <http://www.gnu.org/licenses/>.  */
>>> +
>>> +extern void foo (int *x);
>>> +
>>> +int x;
>>> +
>>> +void
>>> +bar (int *p)
>>> +{
>>> +  *p++;
>>> +}
>>> +
>>> +int
>>> +main ()
>>> +{
>>> +  foo (&x);
>>> +  return 0;
>>> +}
>>> diff --git a/gdb/testsuite/gdb.base/list-dot-nodebug.exp 
>>> b/gdb/testsuite/gdb.base/list-dot-nodebug.exp
>>> new file mode 100644
>>> index 00000000000..7c4144da8ab
>>> --- /dev/null
>>> +++ b/gdb/testsuite/gdb.base/list-dot-nodebug.exp
>>> @@ -0,0 +1,67 @@
>>> +# Copyright 2005-2024 Free Software Foundation, Inc.
>>> +
>>> +# This program is free software; you can redistribute it and/or modify
>>> +# it under the terms of the GNU General Public License as published by
>>> +# the Free Software Foundation; either version 3 of the License, or
>>> +# (at your option) any later version.
>>> +#
>>> +# This program is distributed in the hope that it will be useful,
>>> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
>>> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>> +# GNU General Public License for more details.
>>> +#
>>> +# You should have received a copy of the GNU General Public License
>>> +# along with this program.  If not, see <http://www.gnu.org/licenses/>.
>>> +
>>> +# This test is here to confirm that the command "list ." will print the
>>> +# same message if GDB detects no debug information at all, or 
>>> detects some
>>> +# but nothing for the current objfile.
>>> +
>>> +require !use_gdb_stub
>>> +
>>> +set linkflags [list additional_flags="-static"]
>>> +
>>> +if { ![gdb_can_simple_compile static-libc \
>>> +       {
>>> +           void main (void) { return 0; }
>>> +       } \
>>> +       executable $linkflags] } {
>>> +    untested "Can't statically link"
>>> +    return -1
>>> +}
>>> +
>>> +standard_testfile .c -extra.c
>>> +set objmainfile [standard_output_file ${testfile}-main.o]
>>> +set objextrafile [standard_output_file ${testfile}-extra.o]
>>> +
>>> +if {[gdb_compile "$srcdir/$subdir/$srcfile" $objmainfile object 
>>> {nodebug}] != "" } {
>>> +    untested "couldn't compile main file into object"
>>> +    return -1
>>> +}
>> The gdb_compile line seems redundant, you recompile the test binary
>> within the foreach loop.  With this gone the objmainfile and
>> objextrafile variables seem redundant too.
>>
>>> +
>>> +foreach_with_prefix debug {"none" "some"} {
>>> +
>>> +    set flags "nodebug"
>>> +    if {$debug == "some"} {
>>> +    set flags "debug"
>>> +    }
>>> +
>>> +    if {[prepare_for_testing_full "failed to prepare" \
>>> +        [list ${testfile}-${debug} $linkflags \
>>> +        $srcfile [list nodebug] \
>>> +        $srcfile2 [list $debug]]]} {
>>> +    return -1
>>> +    }
>>> +
>>> +    gdb_test "list ." \
>>> +    "No debug information available to print source lines.*" \
>> I would replace this pattern with:
>>
>>     "^Insufficient debug info for showing source lines at default 
>> location" \
>>
>> this extends the text you used in your earlier reply, but avoids using
>> '.*'.  I think it's better to avoid '.*' unless it's essential.  With
>> this patter we're saying we expect that line, and that line only.
>> Absolutely no other output.
>>
>>> +    "print before start"
>>> +
>>> +    if { ![runto bar] } {
>>> +    return -1
>>> +    }
>>> +
>>> +    gdb_test "list ." \
>>> +    "No debug information available to print source lines at current 
>>> PC.*" \
>> And here:
>>
>>     "^Insufficient debug info for showing source lines at current PC 
>> \\($::hex\\)\\." \
>>
>> With these testsuite fixes, and the other things you changed in your
>> earlier reply:
>>
>> Approved-By: Andrew Burgess <aburgess@redhat.com>
> Thanks, pushed!
> 
 >

I run into fails in the new test-case:
...
FAIL: gdb.base/list-dot-nodebug.exp: debug=none: print before start
FAIL: gdb.base/list-dot-nodebug.exp: debug=some: print before start
...

Filed here ( https://sourceware.org/bugzilla/show_bug.cgi?id=31721 ).

Thanks,
- Tom


  reply	other threads:[~2024-05-10  6:25 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-30 18:35 Guinevere Larsen
2024-05-02  7:54 ` Andrew Burgess
2024-05-02 20:19   ` Guinevere Larsen
2024-05-08 14:25 ` Andrew Burgess
2024-05-08 17:13   ` Guinevere Larsen
2024-05-10  6:26     ` Tom de Vries [this message]
2024-05-10 19:53 ` 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=254a57c9-1f2d-4eec-a68b-14bf62e77ce6@suse.de \
    --to=tdevries@suse.de \
    --cc=aburgess@redhat.com \
    --cc=blarsen@redhat.com \
    --cc=eliz@gnu.org \
    --cc=gdb-patches@sourceware.org \
    --cc=simark@simark.ca \
    /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).