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