[RFC] [PATCH] Provide the ability to write the frame unwinder in Python

Doug Evans dje@google.com
Fri Mar 20 18:32:00 GMT 2015


Andy Wingo writes:
 > Hi,
 > 
 > Thanks for taking the time to look at the patches, Doug!
 > 
 > On Fri 20 Mar 2015 01:15, Doug Evans <dje@google.com> writes:
 > 
 > > 2) IIUC, setting aside hitting the outermost frame and such,
 > > it's a rule that some unwinder will recognize the frame.
 > > Therefore "ephemeral" isn't quite right, even "real"
 > > frames are ephemeral since we toss the frame cache when
 > > the inferior resumes. OTOH, we need to make progress
 > > and I'm just throwing this out there. "ephemeral" is
 > > fine with me: we don't use that term for anything else
 > > which is nice.
 > 
 > Just to throw out some other names -- PendingFrame.  Alexander mentioned
 > InspectedFrame.  IntermediateFrame.  FrameTemplate.  SkeletonFrame.
 > MinimalFrame.  FrameStub.
 > 
 > Dunno, just some ideas :)

I like PendingFrame.
It's a frame, but not a real one yet.

 > > 3) We need to allow sniffers to record anything they
 > > want in gdb.UnwindInfo/<gdb:unwind-info>.
 > 
 > I see from your point (4) later that you are thinking that if we add
 > some kind of callback interface to UnwindInfo that e.g. Guile code might
 > need to fetch arbitrary data from the UnwindInfo.
 > 
 > You also note correctly that this is not currently something that the
 > patches require -- the UnwindInfo contains all of the information, and
 > the C prev_register/this_id callbacks just look into the UnwindInfo
 > data.
 > 
 > If we did add a callback interface I don't think there would be a
 > problem.

Cool.

 > Let's say we want to add a way for prev_register to call back into
 > Guile.  If the prev-register callback is added to the unwind info via
 > unwind-info-set-prev-register-callback! or something then the callback
 > can be a closure that captures the data it needs.  Or it can use an
 > external weak hash table.  Or when we add the
 > set-prev-register-callback! interface, we can add some other associated
 > interface to store data in the unwind-info.  There are multiple fine
 > options here.
 > 
 > > 5) The docs don't make any mention of target endianness
 > > in the saved register values. They probably should.
 > 
 > +1 to Alexander's answer -- as they are GDB values, there shouldn't be
 > an issue, should there?

Well, as I wrote in my reply to Alexander,
we can't control how the user will create these values.
They *might* want to do something off the beaten path, so to speak.
We should specify what's required.

 > > 6) I noticed several routines for building frame ids in Python.
 > > Both Python and Guile support keyword based arguments to functions.
 > > Can we just have one frame id builder function and each take
 > > sp and pc (and special if we need to) as keyword arguments?
 > > E.g. (make-unwind-info ephem-frame #:sp sp #:pc pc)
 > > But see (7) below.
 > >
 > > 7) If we ever need to use frame ids in the extension language
 > > IWBN if they were their own object, in which case we might have
 > > (make-unwind-info ephem-frame #:frame-id frame-id)
 > 
 > This would be fine; and actually at this point the kwarg is unnecessary.

I'd have make-frame-id take kwargs though.

 >   (make-unwind-info ephem-frame frame-id)
 > 
 > > but then I'm wondering if there should be an
 > > unwind-info-set-frame-id! function and move sp,pc there.
 > 
 > I agree with Alexander that this isn't great.  The only thing that an
 > unwinder *must* do is set a frame ID.  It must produce a frame_id at the
 > same time as the sniffer returns TRUE.  (They are different callbacks
 > but always called one after the other.)  Therefore it makes sense to
 > have the invariant:
 > 
 >   Is it an UnwindInfo?  Then it definitely has a frame ID.
 > 
 > That way it takes away one possible error case.

I recognize these points, but I guess in this particular case
I don't feel as strongly. But I don't mind making
frame-id a required argument to make-unwind-info.
So go for it.

 > Also you wouldn't want
 > to set the frame ID on an UnwindInfo twice, it doesn't make sense.

One could say the same of saved registers.

 > > I'm not sure where to put the UnwindInfo creator (factory method).
 > > Do we need one?  Can we just create them via normal object construction?
 > 
 > In Guile you have to give it a name of course -- make-unwind-info.  But
 > in Python I liked Alexander's use of a factory method.  But I dunno,
 > I'll leave the Python discussion to you all :)

A factory method is a layer of abstraction
which is nice (e.g., if later we need to change/extend things
it'd be easier to add a new method or whatever than to play
with the constructor). So ok let's use a factory method.

 > > 8) Re: set_previous_frame_register vs unwind-info-add-saved-register!
 > >
 > > Dunno. On this particular point I guess I don't have a strong
 > > enough interesting in being consistent.
 > > I'll let you guys decide.
 > 
 > If you don't have such an interest on being consistent for this piece
 > then I guess the easy way is to leave these as they are then.  Avoids
 > multiple-day awkward backs and forths :)  But if you decide they need to
 > be the same let us know.
 > 
 > Speaking for myself I prefer the Guile one of course, but I prefer
 > executive decisions over having to endure more days of naming
 > discussions over email :)

I'll make an executive decision to let you guys decide.  1/2 :-)

"But seriously, ..."
Let's go with add_saved_register / unwind-info-add-saved-register!
Sorry Alexander. :-)
I have to pause whenever I read "previous" vs "next": the meaning
is clear in frame-unwind.h, but it just doesn't stick.
E.g., The next frame to unwind is the previous frame on the stack.
Thank goodness frame.c uses all of next/down/inner/younger
and prev/up/outer/older.



More information about the Gdb-patches mailing list