public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 1/2] gdb/python: add gdb.Breakpoint.source_locations property
@ 2022-03-29 21:27 Simon Farre
  2022-03-29 21:27 ` [PATCH 2/2] gdb/python: add gdb.Breakpoint.addresses property Simon Farre
  2022-03-30  8:58 ` [PATCH 1/2] gdb/python: add gdb.Breakpoint.source_locations property Andrew Burgess
  0 siblings, 2 replies; 5+ messages in thread
From: Simon Farre @ 2022-03-29 21:27 UTC (permalink / raw)
  To: gdb-patches; +Cc: Simon Farre

This attribute returns the source locations where
this breakpoint was installed. It's returned as a list
of tuples of type (file path: string, line: long).

Currently it's not possible from the Python API to know
where a breakpoint has been installed.

The rationale for this patch is for IDE or debug adapters
as they are called, for instance for VSCode, to be able
to fetch Breakpoint related data directly from Python,
but also makes it possible to get this data for plugins
without having the parse the string output of the command
`info breakpoints`.
---
 gdb/NEWS                   |  5 +++++
 gdb/doc/python.texi        |  8 ++++++++
 gdb/python/py-breakpoint.c | 31 +++++++++++++++++++++++++++++++
 3 files changed, 44 insertions(+)

diff --git a/gdb/NEWS b/gdb/NEWS
index e10062752d0..9e7e41d3bd6 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -16,6 +16,11 @@
      This is the same format that GDB uses when printing address, symbol,
      and offset information from the disassembler.
 
+  ** Added attribute Breakpoint.source_locations
+     This returns a list of (file path, line number) tuples where the
+     Breakpoint was installed. This is the information displayed
+     by the 'info breakpoints' command.
+
 *** Changes in GDB 12
 
 * DBX mode is deprecated, and will be removed in GDB 13
diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi
index 7c414b01d70..0d842af6229 100644
--- a/gdb/doc/python.texi
+++ b/gdb/doc/python.texi
@@ -6066,6 +6066,14 @@ commands, separated by newlines.  If there are no commands, this
 attribute is @code{None}.  This attribute is writable.
 @end defvar
 
+@defvar Breakpoint.source_locations
+This attribute holds the source locations where the breakpoint installed.
+It returns a list of tuples containing the file path and the line number.
+If the breakpoint has no source location(s), either because it's a pending
+breakpoint or is of a type that doesn't have a source location related to it
+it returns @code{None}. This attribute is not writable.
+@end defvar
+
 @node Finish Breakpoints in Python
 @subsubsection Finish Breakpoints
 
diff --git a/gdb/python/py-breakpoint.c b/gdb/python/py-breakpoint.c
index 5891c3a9735..1b9ac6957a5 100644
--- a/gdb/python/py-breakpoint.c
+++ b/gdb/python/py-breakpoint.c
@@ -692,6 +692,35 @@ bppy_get_ignore_count (PyObject *self, void *closure)
   return gdb_py_object_from_longest (self_bp->bp->ignore_count).release ();
 }
 
+/* Python function to get all source locations where this breakpoint is set.
+   returns a list of tuples containing the file path and the line number.  */
+
+static PyObject* bppy_get_source_locations(PyObject *self, void* closure)
+{
+  gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
+  struct breakpoint* bp = self_bp->bp;
+
+  BPPY_REQUIRE_VALID (self_bp);
+
+  if (!is_breakpoint (bp) || pending_breakpoint_p(bp))
+    Py_RETURN_NONE;
+
+  gdbpy_ref<> list (PyList_New (0));
+
+  for (const bp_location* it = bp->loc; it != nullptr; it = it->next)
+    {
+      PyObject* tuple = PyTuple_New(2);
+      if(PyTuple_SetItem(tuple, 0, host_string_to_python_string (it->symtab->filename).release ()) != 0)
+        return nullptr;
+      if(PyTuple_SetItem(tuple, 1, PyLong_FromLong(it->line_number)) != 0)
+        return nullptr;
+      if(PyList_Append(list.get(), tuple) != 0)
+        return nullptr;
+    }
+
+  return list.release();
+}
+
 /* Internal function to validate the Python parameters/keywords
    provided to bppy_init.  */
 
@@ -1264,6 +1293,8 @@ or None if no condition set."},
     "Whether this breakpoint is a temporary breakpoint."},
   { "pending", bppy_get_pending, NULL,
     "Whether this breakpoint is a pending breakpoint."},
+  { "source_locations", bppy_get_source_locations, NULL,
+    "Source file locations where this breakpoint is installed"},
   { NULL }  /* Sentinel.  */
 };
 

base-commit: b8e92c571baed4e794bd62b7bf417fa8bbaf5c95
-- 
2.32.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2022-03-30 10:04 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-03-29 21:27 [PATCH 1/2] gdb/python: add gdb.Breakpoint.source_locations property Simon Farre
2022-03-29 21:27 ` [PATCH 2/2] gdb/python: add gdb.Breakpoint.addresses property Simon Farre
2022-03-30  8:56   ` Andrew Burgess
2022-03-30 10:04     ` Simon Farre
2022-03-30  8:58 ` [PATCH 1/2] gdb/python: add gdb.Breakpoint.source_locations property Andrew Burgess

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).