On 15/12/16 13:11 -0500, David Malcolm wrote:
On Thu, 2016-12-15 at 17:39 +0000, Jonathan Wakely wrote:
This patch tries to improve the user experience when debugging
container iterators, for cases where some of the typedefs used by the
printers are not in the debuginfo, so gdb.lookup_type() calls fail.
That happens if the iterator's operator*() and operator->() haven't
been instantiated, or if they've been inlined.
Currently this results in an exception:
$1 = Python Exception <class 'ValueError'> Cannot find type
std::_List_iterator<int>::_Node:
If the iterator being printed is part of some other object the whole
thing fails due to the exception.
With this patch the iterator instead prints:
$1 = <insufficient debuginfo for std::list iterator>
and if it's a subobject the rest of the object is printed, with that
as the value of the iterator.
* python/libstdcxx/v6/printers.py
(StdListIteratorPrinter.to_string):
Handle exception from failed type lookup and return user
-friendly
string.
(StdRbtreeIteratorPrinter.__init__): Handle exception from
failed
type lookup.
(StdRbtreeIteratorPrinter.to_string): Return user-friendly
string.
Seem reasonable?
I consider this a stop-gap until we have Xmethods for all our
iterator
types, then we'll be able to "print *iter" even without debuginfo for
all the iterator's members, and we can disable these printers.
BTW, is it always a ValueError exception?
(I'm a little wary of naked "except:" in Python, as it can catch
*anything*, including syntax errors in the try/except-guarded code).
Good point. As far as I know, the gdb.lookup_type method will throw a
ValueError in the case I'm trying to fix. If it can throw other things
we can deal with them later by adding other handlers.