From: Andrew Burgess <aburgess@redhat.com>
To: Guinevere Larsen <blarsen@redhat.com>, gdb-patches@sourceware.org
Cc: Simon Marchi <simark@simark.ca>
Subject: Re: [PATCH] gdb: Change "list ." command's error when no debuginfo is available
Date: Mon, 11 Mar 2024 10:55:30 +0000 [thread overview]
Message-ID: <87v85tox5p.fsf@redhat.com> (raw)
In-Reply-To: <d07e0ff1-7342-45c0-a6ac-aa6a59435c56@redhat.com>
Guinevere Larsen <blarsen@redhat.com> writes:
> On 06/03/2024 14:18, 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 a difference a user should concern themselves with.
>> Why not?
>>
>> Maybe "No symbol table is loaded" isn't the clearest, maybe "No debug
>> information is loaded" might be better, but the first message tells me
>> that there is no debug information, maybe GDB failed to find it, or
>> maybe I need to provide it. The second tells me that GDB did find debug
>> information that covers this address, but it lacks the required detail
>> to help, maybe I forgot -g when compiling?
>
> The situation where I see the second message pops up is when we're, for
> example, in the main function and there are symbols for libc. I may be
> misunderstanding something, but I don't think that debug information
> covers the address the inferior is in.
>
> The situation that we were specifically thinking about was that
>
>>
>> I'm not 100% against this change, I just don't find the motivation super
>> compelling.
>>
>>> This commit
>>> changes it so that the error is always:
>>>
>>> (gdb) list .
>>> No debug information available to print source lines at current PC (0x55555555511d).
>>> or
>>> (gdb) list .
>>> No debug information available to print 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>
>>> ---
>>> gdb/cli/cli-cmds.c | 48 ++++++++++++++++++++++++++++++++--------------
>> For sure this patch should have an associated test change.
> That's a good point... Do you know how I'd be able to get a test running
> with no symbols whatsoever, even if the system that is doing the testing
> has libc symbols?
Could you compile a test binary statically, and then strip all debug
information from it? Would that do what you need?
Thanks,
Andrew
>
> --
> Cheers,
> Guinevere Larsen
> She/Her/Hers
>
>>
>> Thanks,
>> Andrew
>>
>>> 1 file changed, 34 insertions(+), 14 deletions(-)
>>>
>>> diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c
>>> index df11f956245..31f0b6d9907 100644
>>> --- a/gdb/cli/cli-cmds.c
>>> +++ b/gdb/cli/cli-cmds.c
>>> @@ -1236,37 +1236,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);
>>> @@ -1275,25 +1277,43 @@ 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
>>> + (_("No debug information available to print 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 (_("No debug information available to print source "
>>> + "lines at default location"));
>>> + }
>>> + cursal.emplace (get_current_source_symtab_and_line ());
>>> +
>>> + // Not sure if always true, just guessing.
>>> + 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)
>>> --
>>> 2.43.0
prev parent reply other threads:[~2024-03-11 10:55 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-13 14:36 Guinevere Larsen
2024-03-06 12:59 ` [PING][PATCH] " Guinevere Larsen
2024-03-06 13:18 ` [PATCH] " Andrew Burgess
2024-03-06 13:38 ` Guinevere Larsen
2024-03-11 10:55 ` Andrew Burgess [this message]
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=87v85tox5p.fsf@redhat.com \
--to=aburgess@redhat.com \
--cc=blarsen@redhat.com \
--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).