diff options
author | Simon Farre <simon.farre.cx@gmail.com> | 2022-06-07 13:57:48 +0200 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2022-07-28 11:20:46 -0600 |
commit | e5213e2c851c295c5e4c3e9b52606c1012029b67 (patch) | |
tree | 995d6d7e2d06c38a2742586843948f4713cde9f9 /gdb/doc | |
parent | 8727caedd18a93826a825efbfec33aea3b8f3109 (diff) | |
download | gdb-e5213e2c851c295c5e4c3e9b52606c1012029b67.zip gdb-e5213e2c851c295c5e4c3e9b52606c1012029b67.tar.gz gdb-e5213e2c851c295c5e4c3e9b52606c1012029b67.tar.bz2 |
gdb/python: Add BreakpointLocation type
PR python/18385
v7:
This version addresses the issues pointed out by Tom.
Added nullchecks for Python object creations.
Changed from using PyLong_FromLong to the gdb_py-versions.
Re-factored some code to make it look more cohesive.
Also added the more safe Python reference count decrement PY_XDECREF,
even though the BreakpointLocation type is never instantiated by the
user (explicitly documented in the docs) decrementing < 0 is made
impossible with the safe call.
Tom pointed out that using the policy class explicitly to decrement a
reference counted object was not the way to go, so this has instead been
wrapped in a ref_ptr that handles that for us in blocpy_dealloc.
Moved macro from py-internal to py-breakpoint.c.
Renamed section at the bottom of commit message "Patch Description".
v6:
This version addresses the points Pedro gave in review to this patch.
Added the attributes `function`, `fullname` and `thread_groups`
as per request by Pedro with the argument that it more resembles the
output of the MI-command "-break-list". Added documentation for these attributes.
Cleaned up left overs from copy+paste in test suite, removed hard coding
of line numbers where possible.
Refactored some code to use more c++-y style range for loops
wrt to breakpoint locations.
Changed terminology, naming was very inconsistent. Used a variety of "parent",
"owner". Now "owner" is the only term used, and the field in the
gdb_breakpoint_location_object now also called "owner".
v5:
Changes in response to review by Tom Tromey:
- Replaced manual INCREF/DECREF calls with
gdbpy_ref ptrs in places where possible.
- Fixed non-gdb style conforming formatting
- Get parent of bploc increases ref count of parent.
- moved bploc Python definition to py-breakpoint.c
The INCREF of self in bppy_get_locations is due
to the individual locations holding a reference to
it's owner. This is decremented at de-alloc time.
The reason why this needs to be here is, if the user writes
for instance;
py loc = gdb.breakpoints()[X].locations[Y]
The breakpoint owner object is immediately going
out of scope (GC'd/dealloced), and the location
object requires it to be alive for as long as it is alive.
Thanks for your review, Tom!
v4:
Fixed remaining doc issues as per request
by Eli.
v3:
Rewritten commit message, shortened + reworded,
added tests.
Patch Description
Currently, the Python API lacks the ability to
query breakpoints for their installed locations,
and subsequently, can't query any information about them, or
enable/disable individual locations.
This patch solves this by adding Python type gdb.BreakpointLocation.
The type is never instantiated by the user of the Python API directly,
but is produced by the gdb.Breakpoint.locations attribute returning
a list of gdb.BreakpointLocation.
gdb.Breakpoint.locations:
The attribute for retrieving the currently installed breakpoint
locations for gdb.Breakpoint. Matches behavior of
the "info breakpoints" command in that it only
returns the last known or currently inserted breakpoint locations.
BreakpointLocation contains 7 attributes
6 read-only attributes:
owner: location owner's Python companion object
source: file path and line number tuple: (string, long) / None
address: installed address of the location
function: function name where location was set
fullname: fullname where location was set
thread_groups: thread groups (inferiors) where location was set.
1 writeable attribute:
enabled: get/set enable/disable this location (bool)
Access/calls to these, can all throw Python exceptions (documented in
the online documentation), and that's due to the nature
of how breakpoint locations can be invalidated
"behind the scenes", either by them being removed
from the original breakpoint or changed,
like for instance when a new symbol file is loaded, at
which point all breakpoint locations are re-created by GDB.
Therefore this patch has chosen to be non-intrusive:
it's up to the Python user to re-request the locations if
they become invalid.
Also there's event handlers that handle new object files etc, if a Python
user is storing breakpoint locations in some larger state they've
built up, refreshing the locations is easy and it only comes
with runtime overhead when the Python user wants to use them.
gdb.BreakpointLocation Python type
struct "gdbpy_breakpoint_location_object" is found in python-internal.h
Its definition, layout, methods and functions
are found in the same file as gdb.Breakpoint (py-breakpoint.c)
1 change was also made to breakpoint.h/c to make it possible
to enable and disable a bp_location* specifically,
without having its LOC_NUM, as this number
also can change arbitrarily behind the scenes.
Updated docs & news file as per request.
Testsuite: tests the .source attribute and the disabling of
individual locations.
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=18385
Change-Id: I302c1c50a557ad59d5d18c88ca19014731d736b0
Diffstat (limited to 'gdb/doc')
-rw-r--r-- | gdb/doc/python.texi | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index cdf7db9..9a82340 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -6120,6 +6120,15 @@ the user. It is a string. If the breakpoint does not have a location attribute is not writable. @end defvar +@defvar Breakpoint.locations +Get the most current list of breakpoint locations that are inserted for this +breakpoint, with elements of type @code{gdb.BreakpointLocation} +(described below). This functionality matches that of the +@code{info breakpoint} command (@pxref{Set Breaks}), in that it only retrieves +the most current list of locations, thus the list itself when returned is +not updated behind the scenes. This attribute is not writable. +@end defvar + @defvar Breakpoint.expression This attribute holds a breakpoint expression, as specified by the user. It is a string. If the breakpoint does not have an @@ -6140,6 +6149,68 @@ commands, separated by newlines. If there are no commands, this attribute is @code{None}. This attribute is writable. @end defvar +@subheading Breakpoint Locations + +A breakpoint location is one of the actual places where a breakpoint has been +set, represented in the Python API by the @code{gdb.BreakpointLocation} +type. This type is never instantiated by the user directly, but is retrieved +from @code{Breakpoint.locations} which returns a list of breakpoint +locations where it is currently set. Breakpoint locations can become +invalid if new symbol files are loaded or dynamically loaded libraries are +closed. Accessing the attributes of an invalidated breakpoint location will +throw a @code{RuntimeError} exception. Access the @code{Breakpoint.locations} +attribute again to retrieve the new and valid breakpoints location list. + +@defvar BreakpointLocation.source +This attribute returns the source file path and line number where this location +was set. The type of the attribute is a tuple of @var{string} and +@var{long}. If the breakpoint location doesn't have a source location, +it returns None, which is the case for watchpoints and catchpoints. +This will throw a @code{RuntimeError} exception if the location +has been invalidated. This attribute is not writable. +@end defvar + +@defvar BreakpointLocation.address +This attribute returns the address where this location was set. +This attribute is of type long. This will throw a @code{RuntimeError} +exception if the location has been invalidated. This attribute is +not writable. +@end defvar + +@defvar BreakpointLocation.enabled +This attribute holds the value for whether or not this location is enabled. +This attribute is writable (boolean). This will throw a @code{RuntimeError} +exception if the location has been invalidated. +@end defvar + +@defvar BreakpointLocation.owner +This attribute holds a reference to the @code{gdb.Breakpoint} owner object, +from which this @code{gdb.BreakpointLocation} was retrieved from. +This will throw a @code{RuntimeError} exception if the location has been +invalidated. This attribute is not writable. +@end defvar + +@defvar BreakpointLocation.function +This attribute gets the name of the function where this location was set. +If no function could be found this attribute returns @code{None}. +This will throw a @code{RuntimeError} exception if the location has +been invalidated. This attribute is not writable. +@end defvar + +@defvar BreakpointLocation.fullname +This attribute gets the full name of where this location was set. If no +full name could be found, this attribute returns @code{None}. +This will throw a @code{RuntimeError} exception if the location has +been invalidated. This attribute is not writable. +@end defvar + +@defvar BreakpointLocation.thread_groups +This attribute gets the thread groups it was set in. It returns a @code{List} +of the thread group ID's. This will throw a @code{RuntimeError} +exception if the location has been invalidated. This attribute +is not writable. +@end defvar + @node Finish Breakpoints in Python @subsubsection Finish Breakpoints |