This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH v2] Add Guile frame unwinder interface
- From: Pedro Alves <palves at redhat dot com>
- To: Andy Wingo <wingo at igalia dot com>, gdb-patches at sourceware dot org
- Cc: asmundak at google dot com
- Date: Mon, 09 Mar 2015 15:41:21 +0000
- Subject: Re: [PATCH v2] Add Guile frame unwinder interface
- Authentication-results: sourceware.org; auth=none
- References: <87oao7wi66 dot fsf at igalia dot com> <87zj7msbly dot fsf at igalia dot com>
On 03/09/2015 10:34 AM, Andy Wingo wrote:
> +@var{register} names a register, and should be a string, for example
> +@samp{rip}. @var{value} is the register value, as a @value{GDBN}
> +value. Alternately, passing @code{#f} as the value will mark the
> +register as unavailable.
>From a glimpse over the code, I think this actually marks it as
"<not saved>" (optimized out), right? That would be the correct
thing to do. Marking a register as "<unavailable>" is also possible,
but it is a different thing -- it means the value exists, but gdb
couln't get to it, because e.g., the core file is trimmed, or the
ptrace interface is missing access to some registers.
That said, you may want to consider how you'd expand the API
to allow marking registers as unavailable.
> +@end deffn
> +The first argument should be a <gdb:ephemeral-frame> object. The second\n\
> +names a register, and should be a string, for example \"rip\". The\n\
> +third argument is the value, as a GDB value. Alternately, passing #f\n\
> +as the value will mark the register as unavailable." },
Likewise.
> @@ -99,12 +111,17 @@ frame_unwind_try_unwinder (struct frame_info *this_frame, void **this_cache,
> volatile struct gdb_exception ex;
> int res = 0;
>
> + if (is_unwinding)
> + internal_error (__FILE__, __LINE__,
> + _("Recursion detected while finding an unwinder."));
> old_cleanup = frame_prepare_for_sniffer (this_frame, unwinder);
>
> + is_unwinding = 1;
> TRY_CATCH (ex, RETURN_MASK_ERROR)
> {
> res = unwinder->sniffer (unwinder, this_frame, this_cache);
> }
> + is_unwinding = 0;
> if (ex.reason < 0 && ex.error == NOT_AVAILABLE_ERROR)
> {
> /* This usually means that not even the PC is available,
> @@ -249,7 +266,8 @@ frame_unwind_got_constant (struct frame_info *frame, int regnum,
> }
Note that RETURN_MASK_ERROR does not catch all exceptions (notably,
a ctrl-c/QUIT passes right through uncaught).
> +/* Return nonzero if we are in the process of finding an unwinder for a frame.
> + See the comments in get_current_frame(). */
No ()'s.
> +
> +extern int frame_unwind_is_unwinding (void);
Thanks,
Pedro Alves