public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Andy Wingo <wingo@igalia.com>
To: Alexander Smundak <asmundak@google.com>
Cc: Phil Muldoon <pmuldoon@redhat.com>,  Doug Evans <dje@google.com>,
	 gdb-patches <gdb-patches@sourceware.org>
Subject: Re: [RFC] [PATCH] Provide the ability to write the frame unwinder in Python
Date: Wed, 04 Mar 2015 07:49:00 -0000	[thread overview]
Message-ID: <87d24p19tt.fsf@igalia.com> (raw)
In-Reply-To: <CAHQ51u4f+Vx7qXPm-KAAENOceaVogMbDMw6==N_nY+GrLr4Pgg@mail.gmail.com>	(Alexander Smundak's message of "Tue, 3 Mar 2015 18:36:42 -0800")

Howdy :)

Reordering some of the replies.

On Wed 04 Mar 2015 03:36, Alexander Smundak <asmundak@google.com> writes:

>> You'll need a link to the sniffer_info in order to be able to give good
>> errors for set_register, to check that the register exists and that the
>> value is of the correct type and size.
>
> Checking the type and size of the a register in the implementation of
> the `set_register' method depends only on the current architecture,
> not on what's available in the sniffer_info.

There is no current architecture because there may be no selected frame.

In any case the issue is the arch of the frame being unwound, which the
API implies might be different from the target architecture.  I am not
sure how this can be the case; can a GDB person chime in?

So when your user does:

>     previous_frame = UnwindInfo(((AMD64_RBP_NUM, fp), (AMD64_RIP_NUM,
> pc), (AMD64_RSP_NUM, sp)))

you can't correctly detect errors because you don't know the
architecture.

Incidentally if you're doing this from python then what I would want as
a user is a traceback for the error when it occurs.  That's easier to do
if you don't lump multiple things in one call.  For that reason in the
Guile interface you would have, for your example:

  (ephemeral-frame-set-id! frame sp pc)
  (ephemeral-frame-set-register! frame "rbp" fp)
  (ephemeral-frame-set-register! frame "rip" ip)
  (ephemeral-frame-set-register! frame "rsp" sp)

But, to each folk their stroke.

>>>> [W]hy not specify registers as strings, as elsewhere
>>>> (e.g. gdb.Frame.read_register)?
>
> The function mapping a register name to the number,
> `user_reg_map_name_to_regnum', compares given register name
> with all known register names, one at a time. I thought Python interpreter
> is somewhat smarter than that and use dictionaries for lookups. Even if
> it is not, there is no need to pile up inefficiency.
> Actually, it's not that difficult to be able to pass either a register number,
> or register name.

The one-at-a-time nature of user_reg_map_name_to_regnum is a detail and
not essential.

However I think we have argued this enough and I won't say any more
about it, being as I don't have LGTM power over these things :-))

>>>> In the read_register() function, I believe you can use
>>>> get_frame_register_value instead of deprecated_frame_register_read.
>
> Here's traceback I get when I try to call value_of_register:

I suggested "get_frame_register_value", not "value_of_register".
Confusion is understandable though with all these similarly-named,
similarly-purposed functions...

>> Alexander, did you not run into nasty crashes while doing random Python
>> things inside your unwind handler?
> I used to have random crashes before I learned to call `ensure_python_env'
> to establish Python runtime environment before suing Python API, but after
> that, no. Do you have an example that you can share?

Sure; I figured out what was going on yesterday.  With your test cases,
is the innermost frame handled by the unwinder?  I ran into lots of
problems there, because -- and I'm going to have to bullet-point this as
it gets complicated --

  * An unwinder is called on the innermost frame.

  * Many actions, for example looking up a symbol without specifying a
    block. will request the selected frame.

  * get_selected_frame() sees there is no selected frame, and goes to
    get_current_frame() and will select that.

  * get_current_frame creates a sentinel frame and unwinds that to
    produce the innermost frame.

  * After unwinding saved registers from the sentinel, frame.c finishes
    constructing the innermost frame by doing a compute_frame_id() on
    the frame.

  * compute_frame_id() goes to compute the unwinder for the innermost
    frame, in order to call the this_id() method, which leads us back to
    the beginning.

You may not have seen this if your test cases do not have an
"interesting" frame as the innermost frame.

I have a fix for this, but it's a bit deep.  I'll post my patch today.
Happily, with a combination of unwinders and frame filters, I am able to
get a correct, pretty backtrace:

  #0  0x00000d3c5b0661a1 in TestCase () at /hack/v8/test/mjsunit/debug-step-4-in-frame.js:94
  #1  0x00000d3c5b06a3d3 in  () at /hack/v8/test/mjsunit/debug-step-4-in-frame.js:112
  #2  0x00000d3c5b02c620 in [internal frame] ()
  #3  0x00000d3c5b014d31 in [entry frame] ()
  #4  0x0000000000b4e949 in v8::internal::Invoke(...) at ../src/execution.cc:128
  #5  0x0000000000b4ed23 in v8::internal::Execution::Call(...) at ../src/execution.cc:179
  #6  0x0000000000a3f813 in v8::Script::Run() at ../src/api.cc:1514
  #7  0x0000000000a149fa in v8::Shell::ExecuteString(...) at ../src/d8.cc:281
  #8  0x0000000000a194eb in v8::SourceGroup::Execute(...) at ../src/d8.cc:1213
  #9  0x0000000000a1a128 in v8::Shell::RunMain(...) at ../src/d8.cc:1448
  #10 0x0000000000a1efdc in v8::Shell::Main(...) at ../src/d8.cc:1721
  #11 0x0000000000a1f143 in main(...) at ../src/d8.cc:1757

Before, the backtrace was garbled, incorrect, without names, and wasn't
able to unwind out of the compiled JS code.  Wheeee :-))

Andy

  reply	other threads:[~2015-03-04  7:49 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-15 18:14 Alexander Smundak
2014-12-22 19:24 ` Alexander Smundak
2014-12-29 18:02   ` Alexander Smundak
2015-01-05 17:53     ` Alexander Smundak
2015-01-12 20:03       ` Alexander Smundak
2015-01-22  3:31         ` Alexander Smundak
2015-01-29  1:36           ` Alexander Smundak
2015-01-12 21:00 ` Simon Marchi
2015-01-12 21:22   ` Doug Evans
2015-02-04 22:36 ` Doug Evans
2015-02-12 17:58   ` Alexander Smundak
2015-02-19  2:32     ` Alexander Smundak
2015-02-20 11:12     ` Phil Muldoon
2015-02-26  3:09       ` Alexander Smundak
2015-03-02 22:56         ` Alexander Smundak
2015-03-03  8:46           ` Andy Wingo
2015-03-04  2:36             ` Alexander Smundak
2015-03-04  7:49               ` Andy Wingo [this message]
2015-03-09 11:02                 ` Phil Muldoon
2015-03-11  2:22                   ` Alexander Smundak
2015-03-11  8:49                     ` Andy Wingo
2015-03-11 17:34                       ` Doug Evans
2015-03-11 18:48                       ` Alexander Smundak
2015-03-16 11:29                         ` Andy Wingo
2015-03-16 12:01                           ` Andy Wingo
2015-03-16 17:25                           ` Alexander Smundak
2015-03-17  8:57                             ` Andy Wingo
2015-03-17 19:48                               ` Alexander Smundak
2015-03-17 21:37                                 ` Alexander Smundak
2015-03-18  8:54                                   ` Andy Wingo
2015-03-18 22:57                                     ` Alexander Smundak
2015-03-23 19:58                                       ` Doug Evans
2015-03-24  9:06                                         ` Andy Wingo
2015-03-26  3:31                                         ` Alexander Smundak
2015-03-26 18:53                                           ` Eli Zaretskii
2015-03-27 22:29                                           ` Doug Evans
2015-03-28  1:10                                             ` Alexander Smundak
2015-03-30 17:45                                               ` Doug Evans
2015-03-30 19:49                                                 ` Alexander Smundak
2015-03-31 22:36                                                   ` Doug Evans
2015-04-01  0:09                                                     ` Alexander Smundak
2015-04-01  0:28                                                       ` Doug Evans
2015-03-18 23:25                                 ` Doug Evans
2015-03-19  0:36                                   ` Alexander Smundak
2015-03-19  8:12                                     ` Andy Wingo
2015-03-20  0:15                                       ` Doug Evans
2015-03-20  2:27                                         ` Alexander Smundak
2015-03-20 17:48                                           ` Doug Evans
2015-03-20  8:26                                         ` Andy Wingo
2015-03-20 18:32                                           ` Doug Evans
2015-03-17 22:21                               ` Doug Evans
2015-03-18  8:57                                 ` Andy Wingo
2015-03-18 16:48                                   ` Doug Evans
2015-03-19  8:04                                     ` Andy Wingo
2015-03-09  9:42           ` Andy Wingo
2015-03-03  0:49         ` Alexander Smundak
2015-03-03 14:38           ` Andy Wingo
2015-03-04  2:52             ` Alexander Smundak
2015-02-20  9:42 ` Phil Muldoon
2015-02-20  9:59   ` Phil Muldoon

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=87d24p19tt.fsf@igalia.com \
    --to=wingo@igalia.com \
    --cc=asmundak@google.com \
    --cc=dje@google.com \
    --cc=gdb-patches@sourceware.org \
    --cc=pmuldoon@redhat.com \
    /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).