Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Tom Tromey <tom@tromey.com>
To: gdb-patches@sourceware.org
Cc: Tom Tromey <tom@tromey.com>
Subject: [PATCH 09/14] Update Python unwinder documentation
Date: Sat, 08 Sep 2018 20:22:00 -0000	[thread overview]
Message-ID: <20180908201417.13444-10-tom@tromey.com> (raw)
In-Reply-To: <20180908201417.13444-1-tom@tromey.com>

PR python/19808 points out a few issues in the Python unwinder
documentation.  This patch update the documentation for
create_unwind_info and read_register to address the issues noted, and
adds a cautionary note about writing an unwinder.

gdb/doc/ChangeLog
2018-09-08  Tom Tromey  <tom@tromey.com>

	PR python/19808:
	* python.texi (Unwinding Frames in Python): Rewrite
	create_unwind_info documentation.  Update read_register
	documentation and add a note about unwinder caution.
---
 gdb/doc/ChangeLog   |  7 +++++++
 gdb/doc/python.texi | 55 ++++++++++++++++++++++++++++++++++++++++++++---------
 2 files changed, 53 insertions(+), 9 deletions(-)

diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi
index 47691c448d2..ccad593e247 100644
--- a/gdb/doc/python.texi
+++ b/gdb/doc/python.texi
@@ -2290,17 +2290,40 @@ return @code{None}.  The code in @value{GDBN} that enables writing
 unwinders in Python uses this object to return frame's ID and previous
 frame registers when @value{GDBN} core asks for them.
 
+An unwinder should do as little work as possible.  Some otherwise
+innocuous operations can cause problems (even crashes, as this code is
+not not well-hardened yet).  For example, making an inferior call from
+an unwinder is unadvisable, as an inferior call will reset
+@value{GDBN}'s stack unwinding process, potentially causing re-entrant
+unwinding.
+
 @subheading Unwinder Input
 
 An object passed to an unwinder (a @code{gdb.PendingFrame} instance)
 provides a method to read frame's registers:
 
 @defun PendingFrame.read_register (reg)
-This method returns the contents of the register @var{regn} in the
+This method returns the contents of the register @var{reg} in the
 frame as a @code{gdb.Value} object.  @var{reg} can be either a
 register number or a register name; the values are platform-specific.
 They are usually found in the corresponding
-@file{@var{platform}-tdep.h} file in the @value{GDBN} source tree.
+@file{@var{platform}-tdep.h} file in the @value{GDBN} source tree.  If
+@var{reg} does not name a register for the current architecture, this
+method will throw an exception.
+
+Note that this method will always return a @code{gdb.Value} for a
+valid register name.  This does not mean that the value will be valid.
+For example, you may request a register that an earlier unwinder could
+not unwind---the value will be unavailable.  Instead, the
+@code{gdb.Value} returned from this method will be lazy; that is, its
+underlying bits will not be fetched until it is first used.  So,
+attempting to use such a value will cause an exception at the point of
+use.
+
+The type of the returned @code{gdb.Value} depends on the register and
+the architecture.  It is common for registers to have a scalar type,
+like @code{long long}; but many other types are possible, such as
+pointer, pointer-to-function, floating point or vector types.
 @end defun
 
 It also provides a factory method to create a @code{gdb.UnwindInfo}
@@ -2313,18 +2336,32 @@ using one of functions provided by @value{GDBN}.  @var{frame_id}'s attributes
 determine which function will be used, as follows:
 
 @table @code
-@item sp, pc, special
-@code{frame_id_build_special (@var{frame_id}.sp, @var{frame_id}.pc, @var{frame_id}.special)}
-
 @item sp, pc
-@code{frame_id_build (@var{frame_id}.sp, @var{frame_id}.pc)}
+The frame is identified by the given stack address and PC.  The stack
+address must be chosen so that it is constant throughout the lifetime
+of the frame, so a typical choice is the value of the stack pointer at
+the start of the function---in the DWARF standard, this would be the
+``Call Frame Address''.
+
+This is the most common case by far.  The other cases are documented
+for completeness but are only useful in specialized situations.
 
-This is the most common case.
+@item sp, pc, special
+The frame is identified by the stack address, the PC, and a
+``special'' address.  The special address is used on architectures
+that can have frames that do not change the stack, but which are still
+distinct, for example the IA-64, which has a second stack for
+registers.  Both @var{sp} and @var{special} must be constant
+throughout the lifetime of the frame.
 
 @item sp
-@code{frame_id_build_wild (@var{frame_id}.sp)}
+The frame is identified by the stack address only.  Any other stack
+frame with a matching @var{sp} will be considered to match this frame.
+Inside gdb, this is called a ``wild frame''.  You will never need
+this.
 @end table
-The attribute values should be @code{gdb.Value}
+
+Each attribute value should be an instance of @code{gdb.Value}.
 
 @end defun
 
-- 
2.13.6


  parent reply	other threads:[~2018-09-08 20:22 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-08 20:14 [PATCH 00/14] Many small Python documentation fixes Tom Tromey
2018-09-08 20:14 ` [PATCH 13/14] Swap two sentences in the Pretty Printing API node Tom Tromey
2018-09-08 21:11   ` Eli Zaretskii
2018-09-08 20:14 ` [PATCH 02/14] Fix typo in pretty-printer example Tom Tromey
2018-09-08 21:12   ` Eli Zaretskii
2018-09-08 20:14 ` [PATCH 14/14] Remove periods from Python section titles Tom Tromey
2018-09-08 21:14   ` Eli Zaretskii
2018-09-08 20:14 ` [PATCH 08/14] Fix gdb.events.inferior_call documentation Tom Tromey
2018-09-08 21:10   ` Eli Zaretskii
2018-09-08 20:14 ` [PATCH 07/14] Update Python frame filter documentation Tom Tromey
2018-09-08 21:09   ` Eli Zaretskii
2018-09-08 20:14 ` [PATCH 10/14] Mention Python versions in the documentation Tom Tromey
2018-09-08 21:16   ` Eli Zaretskii
2018-09-08 20:14 ` [PATCH 03/14] Document that Frame.block can throw Tom Tromey
2018-09-08 21:07   ` Eli Zaretskii
2018-09-08 20:14 ` [PATCH 11/14] Small typo fix in Basic Python node Tom Tromey
2018-09-08 21:08   ` Eli Zaretskii
2018-09-08 20:14 ` [PATCH 12/14] Mention virtual tables in Python dynamic_type documentation Tom Tromey
2018-09-08 21:13   ` Eli Zaretskii
2018-09-08 20:14 ` [PATCH 04/14] Fix help text for "python" command Tom Tromey
2018-09-08 20:14 ` [PATCH 06/14] Reword gdb.GdbError text Tom Tromey
2018-09-08 21:16   ` Eli Zaretskii
2018-09-08 20:14 ` [PATCH 05/14] Avoid warnings from makeinfo Tom Tromey
2018-09-08 21:09   ` Eli Zaretskii
2018-09-08 20:14 ` [PATCH 01/14] Update Python Block.end documentation Tom Tromey
2018-09-08 20:22 ` Tom Tromey [this message]
2018-09-08 21:18   ` [PATCH 09/14] Update Python unwinder documentation Eli Zaretskii
2018-09-10 13:44 ` [PATCH 00/14] Many small Python documentation fixes Tom Tromey

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=20180908201417.13444-10-tom@tromey.com \
    --to=tom@tromey.com \
    --cc=gdb-patches@sourceware.org \
    /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