[gdb] - Fix Python new-backtrace command (BZ 672235, Phil Muldoon).

Jan Kratochvil jankratochvil at fedoraproject.org
Thu Jan 27 10:56:17 UTC 2011


commit c00fd45a3e3c3187c8fac3e67985a5b83c36a27e
Author: Jan Kratochvil <jan.kratochvil at redhat.com>
Date:   Thu Jan 27 11:55:59 2011 +0100

    - Fix Python new-backtrace command (BZ 672235, Phil Muldoon).

 gdb-python-newbacktrace.patch |  154 +++++++++++++++++++++++++++++++++++++++++
 gdb.spec                      |   13 +++-
 2 files changed, 166 insertions(+), 1 deletions(-)
---
diff --git a/gdb-python-newbacktrace.patch b/gdb-python-newbacktrace.patch
new file mode 100644
index 0000000..31439fa
--- /dev/null
+++ b/gdb-python-newbacktrace.patch
@@ -0,0 +1,154 @@
+http://sourceware.org/ml/archer/2011-q1/msg00024.html
+Subject: [patch] Fix RH BZ 672235
+
+
+Bug:
+
+http://bugzilla.redhat.com/show_bug.cgi?id=672235
+
+The latter half of this bug was caused by removing the value function
+from gdb.Symbol.  This happened quite some time ago, so I am a little
+surprised it took this long to surface.
+
+The old Symbol.value function never returned anything except a gdb.Block
+if the symbol happened to represent a function a block.  Anything else
+raised an error.  Way back when, I removed this function as it was an
+obvious stub, and it was superseded by frame.read_var() which is a more
+accurate method of determining the value of a symbol.
+
+Wind forward to today, and it turns out one of the unported
+archer-tromey-python scripts we ship in Fedora relies on this (symbol ->
+block) API.  I thought about ways of trying to fix this. I thought about
+just changing FrameWrapper to just take a block instead of a symbol
+representing a function.  But FrameWrapper has an API that we shipped.
+I tried to find the block through the existing API, but that did not
+work too well.  The gdb.Block method block_for_pc can return a block
+from a pc but this just turned out to be expensive and convoluted.  I
+eventually just elected to add a block() function to gdb.Symbol which,
+if the symbol represented a method or a function, would return the block.
+Yet I am still not entirely satisfied.  It seems weird to ask the user
+to retrieve symbol value from frame.read_var for most symbols, but in
+the case of a function or method, use block().  I tried to use read_var
+for this, but it returns a gdb.Value, and I could not figure out a way to
+transform a gdb.Value to a gdb.Block.
+
+Before I submit this for upstream review I'd like to see if anyone has
+any comments.
+
+Cheers
+
+Phil
+
+--
+
+diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
+index 161ac1f..55eca2a 100644
+--- a/gdb/doc/gdb.texinfo
++++ b/gdb/doc/gdb.texinfo
+@@ -22718,6 +22718,13 @@ domain constant defined in the @code{gdb} module and described later
+ in this chapter.
+ @end defun
+ 
++A @code{gdb.Symbol} object has the following methods:
++
++ at defmethod Symbol block
++Returns a @code{gdb.Block} object if the symbol is a function or a
++method.  @xref{Blocks In Python}.
++ at end defmethod
++
+ A @code{gdb.Symbol} object has the following attributes:
+ 
+ @table @code
+diff --git a/gdb/python/lib/gdb/FrameWrapper.py b/gdb/python/lib/gdb/FrameWrapper.py
+index b790a54..5d98b0f 100644
+--- a/gdb/python/lib/gdb/FrameWrapper.py
++++ b/gdb/python/lib/gdb/FrameWrapper.py
+@@ -46,7 +46,7 @@ class FrameWrapper:
+             return
+ 
+         first = True
+-        block = func.value
++        block = func.block ()
+ 
+         for sym in block:
+             if sym.is_argument:
+@@ -60,7 +60,7 @@ class FrameWrapper:
+             return
+ 
+         first = True
+-        block = func.value
++        block = func.block ()
+ 
+         for sym in block:
+             if not sym.is_argument:
+diff --git a/gdb/python/py-symbol.c b/gdb/python/py-symbol.c
+index e072dc8..1dfe394 100644
+--- a/gdb/python/py-symbol.c
++++ b/gdb/python/py-symbol.c
+@@ -167,6 +167,27 @@ sympy_is_variable (PyObject *self, void *closure)
+ 			      || class == LOC_OPTIMIZED_OUT));
+ }
+ 
++static PyObject *
++sympy_get_block (PyObject *self, PyObject *args)
++{
++  struct symbol *symbol = NULL;
++
++  SYMPY_REQUIRE_VALID (self, symbol);
++
++  if (SYMBOL_CLASS (symbol) == LOC_BLOCK)
++    {
++      struct symtab *symt = SYMBOL_SYMTAB (symbol);
++
++      return block_to_block_object (SYMBOL_BLOCK_VALUE (symbol),
++				    symt->objfile);
++    }
++  else
++    PyErr_SetString (PyExc_RuntimeError,
++		     _("Symbol is not a block class."));
++
++  return NULL;
++}
++
+ /* Given a symbol, and a symbol_object that has previously been
+    allocated and initialized, populate the symbol_object with the
+    struct symbol data.  Also, register the symbol_object life-cycle
+@@ -362,6 +383,13 @@ gdbpy_initialize_symbols (void)
+ 
+ 
+ 
++static PyMethodDef symbol_object_methods[] = {
++  { "block", sympy_get_block, METH_NOARGS,
++    "block () -> gdb.Block.\n\
++Return the block of this symbol, if the symbol represents a function." },
++  {NULL}  /* Sentinel */
++};
++
+ static PyGetSetDef symbol_object_getset[] = {
+   { "symtab", sympy_get_symtab, NULL,
+     "Symbol table in which the symbol appears.", NULL },
+@@ -415,7 +443,7 @@ PyTypeObject symbol_object_type = {
+   0,				  /*tp_weaklistoffset */
+   0,				  /*tp_iter */
+   0,				  /*tp_iternext */
+-  0,				  /*tp_methods */
++  symbol_object_methods,	  /*tp_methods */
+   0,				  /*tp_members */
+   symbol_object_getset		  /*tp_getset */
+ };
+diff --git a/gdb/testsuite/gdb.python/py-symbol.exp b/gdb/testsuite/gdb.python/py-symbol.exp
+index 8e3aec1..6d43566 100644
+--- a/gdb/testsuite/gdb.python/py-symbol.exp
++++ b/gdb/testsuite/gdb.python/py-symbol.exp
+@@ -69,6 +69,10 @@ gdb_test "python print func.print_name" "func" "Test func.print_name"
+ gdb_test "python print func.linkage_name" "func" "Test func.linkage_name"
+ gdb_test "python print func.addr_class == gdb.SYMBOL_LOC_BLOCK" "True" "Test func.addr_class"
+ 
++# Test block() method
++gdb_py_test_silent_cmd "python func = frame.block().function" "Get block" 0
++gdb_test "python print func.block().function.name" "func" "Test block method"
++
+ gdb_breakpoint [gdb_get_line_number "Break at end."]
+ gdb_continue_to_breakpoint "Break at end."
+ gdb_py_test_silent_cmd "python frame = gdb.selected_frame()" "Get Frame" 0
+
diff --git a/gdb.spec b/gdb.spec
index f92a7f6..41074da 100644
--- a/gdb.spec
+++ b/gdb.spec
@@ -27,7 +27,7 @@ Version: 7.2.50.20110125
 
 # The release always contains a leading reserved number, start it at 1.
 # `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
-Release: 15%{?_with_upstream:.upstream}%{?dist}
+Release: 16%{?_with_upstream:.upstream}%{?dist}
 
 License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and GFDL and BSD and Public Domain
 Group: Development/Debuggers
@@ -541,14 +541,21 @@ Patch548: gdb-test-expr-cumulative-archer.patch
 Patch552: gdb-gdbindex-v4-2of3.patch
 
 # Fix DWARF-3+ DW_AT_accessibility default assumption for F15 gcc-4.6.
+# =push
 Patch554: gdb-dwarf3-accessibility.patch
 
 # Temporary fix of F15 gcc-4.6 child DIEs of DW_TAG_typedef (BZ 672230).
+# =push
 Patch555: gdb-gcc46-typedef.patch
 
 # Workaround gcc-4.6 stdarg false prologue end (GDB PR 12435 + GCC PR 47471).
+# =push
 Patch556: gdb-gcc46-stdarg-prologue.patch
 
+# Fix Python new-backtrace command (BZ 672235, Phil Muldoon).
+# =push
+Patch557: gdb-python-newbacktrace.patch
+
 BuildRequires: ncurses-devel%{?_isa} texinfo gettext flex bison expat-devel%{?_isa}
 Requires: readline%{?_isa}
 BuildRequires: readline-devel%{?_isa}
@@ -802,6 +809,7 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
 %patch554 -p1
 %patch555 -p1
 %patch556 -p1
+%patch557 -p1
 
 %patch390 -p1
 %patch393 -p1
@@ -1208,6 +1216,9 @@ fi
 %endif
 
 %changelog
+* Thu Jan 27 2011 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.2.50.20110125-16.fc15
+- Fix Python new-backtrace command (BZ 672235, Phil Muldoon).
+
 * Wed Jan 26 2011 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.2.50.20110125-15.fc15
 - Temporary fix of F15 gcc-4.6 child DIEs of DW_TAG_typedef (BZ 672230).
 - Workaround gcc-4.6 stdarg false prologue end (GDB PR 12435 + GCC PR 47471).


More information about the scm-commits mailing list