From: Eli Zaretskii <eliz@gnu.org>
To: Simon Marchi <simon.marchi@polymtl.ca>
Cc: gdb-patches@sourceware.org
Subject: Re: GDB internal error in pc_in_thread_step_range
Date: Sun, 16 Dec 2018 15:40:00 -0000 [thread overview]
Message-ID: <8336qxfpjo.fsf@gnu.org> (raw)
In-Reply-To: <e1065324-72b2-1a80-fccd-b5624ed9b37c@polymtl.ca> (message from Simon Marchi on Sat, 15 Dec 2018 22:57:57 -0500)
> Cc: gdb-patches@sourceware.org
> From: Simon Marchi <simon.marchi@polymtl.ca>
> Date: Sat, 15 Dec 2018 22:57:57 -0500
>
> Hi Eli,
>
> Sorry for the wait. I don't really have an good answer for you, but I thought I'd
> reply anyway, maybe this will help generate ideas.
Thanks for replying.
> > if (address)
> > {
> > if (pc_in_unmapped_range (pc, section))
> > *address = overlay_unmapped_address (cache_pc_function_low, section);
> > else
> > *address = cache_pc_function_low;
> > }
> >
> > if (name)
> > *name = cache_pc_function_name;
> >
> > if (endaddr)
> > {
> > if (pc_in_unmapped_range (pc, section))
> > {
> > /* Because the high address is actually beyond the end of
> > the function (and therefore possibly beyond the end of
> > the overlay), we must actually convert (high - 1) and
> > then add one to that. */
> >
> > *endaddr = 1 + overlay_unmapped_address (cache_pc_function_high - 1,
> > section);
> > }
> > else
> > *endaddr = cache_pc_function_high;
> > }
> >
> > The cached values are zero and 1, correspondingly.
>
> Do you mean that cache_pc_function_low is 0 and cache_pc_function_high is 1?
Yes.
> Do these values even make sense?
What else can we expect from a code at PC for which there's absolutely
no symbolic information? So yes, I think it's reasonable, but I'm far
from being an expert on these parts of GDB.
> They are supposed to hold a range of program addresses, so 0 and 1
> seem bogus. Maybe this is the result of something going wrong
> before? It would be interesting to understand how they end up with
> these values.
They are assigned here:
cache_pc_function_low = BMSYMBOL_VALUE_ADDRESS (msymbol);
cache_pc_function_name = MSYMBOL_LINKAGE_NAME (msymbol.minsym);
cache_pc_function_section = section;
cache_pc_function_high = minimal_symbol_upper_bound (msymbol);
cache_pc_function_block = nullptr;
This is part of find_pc_partial_function. I verified that
minimal_symbol_upper_bound returns 1 in this case, and that this value
of 1 is assigned here:
obj_section = MSYMBOL_OBJ_SECTION (minsym.objfile, minsym.minsym);
if (MSYMBOL_LINKAGE_NAME (msymbol + i) != NULL
&& (MSYMBOL_VALUE_ADDRESS (minsym.objfile, msymbol + i)
< obj_section_endaddr (obj_section)))
result = MSYMBOL_VALUE_ADDRESS (minsym.objfile, msymbol + i); <<<<<<
else
Once again, I'm not an expert on this stuff, but just thinking about
the situation, what else could GDB return in this case?
> If find_pc_partial_function is unable to determine a proper symbol and some proper
> bounds, it should return 0. So if it returns 1 but returns some wrong data,
> something is fishy.
If it returns zero, we will emit an error message:
if (find_pc_partial_function (pc, &name,
&tp->control.step_range_start,
&tp->control.step_range_end) == 0)
error (_("Cannot find bounds of current function"));
So I'm not sure this is a good idea. Instead, I propose the following
change:
--- gdb/infrun.c~0 2018-07-04 18:41:59.000000000 +0300
+++ gdb/infrun.c 2018-12-16 11:02:24.103425700 +0200
@@ -2713,7 +2713,13 @@ resume_1 (enum gdb_signal sig)
displaced_step_dump_bytes (gdb_stdlog, buf, sizeof (buf));
}
- if (tp->control.may_range_step)
+ if (tp->control.may_range_step
+ /* If .step_range_start == 0 and .step_range_end == 1, we don't
+ really know the step range, so don't check in that case.
+ (This is known to happen on MinGW when stepping the program
+ epilogue code after 'main' returns.) */
+ && !(tp->control.step_range_start == 0x0
+ && tp->control.step_range_end == 0x1))
{
/* If we're resuming a thread with the PC out of the step
range, then we're doing some nested/finer run control
Thanks.
next prev parent reply other threads:[~2018-12-16 15:40 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <83h8kjr8r6.fsf@gnu.org>
[not found] ` <100001f1b27aa7d90902a75d5db37710@polymtl.ca>
2018-11-18 16:37 ` Eli Zaretskii
2018-11-30 13:42 ` Eli Zaretskii
2018-12-07 7:22 ` Eli Zaretskii
2018-12-15 12:07 ` Eli Zaretskii
2018-12-16 3:58 ` Simon Marchi
2018-12-16 15:40 ` Eli Zaretskii [this message]
2018-12-16 17:06 ` Simon Marchi
2018-12-16 17:22 ` Eli Zaretskii
2018-12-16 18:06 ` Simon Marchi
2018-12-19 15:50 ` Eli Zaretskii
2018-12-20 0:16 ` Simon Marchi
2018-12-20 15:45 ` Eli Zaretskii
2018-12-20 23:03 ` Simon Marchi
2018-12-22 8:44 ` Eli Zaretskii
2018-12-22 16:47 ` Simon Marchi
2018-12-23 5:35 ` Joel Brobecker
2018-12-23 15:23 ` Eli Zaretskii
2018-12-23 15:33 ` Simon Marchi
2018-12-23 16:10 ` Eli Zaretskii
2018-12-23 23:31 ` Simon Marchi
2018-12-24 16:14 ` Eli Zaretskii
2018-12-24 16:29 ` Simon Marchi
2018-12-28 7:09 ` Eli Zaretskii
2018-12-28 10:09 ` Joel Brobecker
2018-12-28 10:15 ` Eli Zaretskii
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=8336qxfpjo.fsf@gnu.org \
--to=eliz@gnu.org \
--cc=gdb-patches@sourceware.org \
--cc=simon.marchi@polymtl.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