This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH 2/2] Report stop locations in inlined functions.
- From: Pedro Alves <palves at redhat dot com>
- To: Keith Seitz <keiths at redhat dot com>, gdb-patches at sourceware dot org
- Date: Fri, 27 Oct 2017 13:37:30 +0100
- Subject: Re: [PATCH 2/2] Report stop locations in inlined functions.
- Authentication-results: sourceware.org; auth=none
- Authentication-results: ext-mx03.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com
- Authentication-results: ext-mx03.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=palves at redhat dot com
- Dmarc-filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 000052FC2
- References: <1499740601-15957-1-git-send-email-keiths@redhat.com> <1499740601-15957-2-git-send-email-keiths@redhat.com> <4bfba041-22f5-1650-1f83-0f8860f202fb@redhat.com> <17ac2bdc-cd7b-d8f1-bf75-056fe87ca916@redhat.com> <db907503-fb8e-3b0f-8b67-d1139299ae4a@redhat.com>
On 10/20/2017 08:21 PM, Keith Seitz wrote:
>
> *1 The "simpler" solution (for illustration only)
>
> diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
> index 32ceea7..4d2ebd8 100644
> --- a/gdb/breakpoint.c
> +++ b/gdb/breakpoint.c
> @@ -68,6 +68,7 @@
> #include "format.h"
> #include "thread-fsm.h"
> #include "tid-parse.h"
> +#include "inline-frame.h"
>
> /* readline include files */
> #include "readline/readline.h"
> @@ -5359,6 +5360,7 @@ bpstat_check_breakpoint_conditions (bpstat bs, ptid_t ptid)
> }
> CATCH (ex, RETURN_MASK_ALL)
> {
> + clear_inline_frame_state (ptid);
> exception_fprintf (gdb_stderr, ex,
> "Error in testing breakpoint condition:\n");
> }
> diff --git a/gdb/infrun.c b/gdb/infrun.c
> index d00c5f6..60fd166 100644
> --- a/gdb/infrun.c
> +++ b/gdb/infrun.c
> @@ -5864,6 +5864,12 @@ handle_signal_stop (struct execution_control_state *ecs)
> stop_print_frame = 1;
> stopped_by_random_signal = 0;
>
> + /* See if there is a breakpoint/watchpoint/catchpoint/etc. that
> + handles this event. */
> + ecs->event_thread->control.stop_bpstat
> + = bpstat_stop_status (get_regcache_aspace (get_current_regcache ()),
> + stop_pc, ecs->ptid, &ecs->ws);
> +
> /* Hide inlined functions starting here, unless we just performed stepi or
> nexti. After stepi and nexti, always show the innermost frame (not any
> inline function call sites). */
> @@ -5894,7 +5900,12 @@ handle_signal_stop (struct execution_control_state *ecs)
> ecs->event_thread->prev_pc,
> &ecs->ws)))
> {
> - skip_inline_frames (ecs->ptid);
> + struct breakpoint *bpt = NULL;
> +
> + if (ecs->event_thread->control.stop_bpstat != NULL)
> + bpt = ecs->event_thread->control.stop_bpstat->breakpoint_at;
> +
> + skip_inline_frames (ecs->ptid, bpt);
>
> /* Re-fetch current thread's frame in case that invalidated
> the frame cache. */
> @@ -5939,12 +5950,6 @@ handle_signal_stop (struct execution_control_state *ecs)
> }
> }
>
> - /* See if there is a breakpoint/watchpoint/catchpoint/etc. that
> - handles this event. */
> - ecs->event_thread->control.stop_bpstat
> - = bpstat_stop_status (get_regcache_aspace (get_current_regcache ()),
> - stop_pc, ecs->ptid, &ecs->ws);
> -
> /* Following in case break condition called a
> function. */
> stop_print_frame = 1;
>
>
>
> *2 The more "complex," safer solution (for illustration only)
Can you send me these as full patches, or send me the
patch they apply on top of too? I'll need to play with
it a bit to understand it all better.
Thanks,
Pedro Alves