From 3e2e0c6edc3bde3538106b27eb270dff776b826f Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 27 Sep 2019 15:40:35 +0200 Subject: [PATCH] Debugger: Use GDB's own pretty printers more cautiously Looks like there is no attempt made on the GDB/libstdc++ side to recognize uninitialized objects, so we cannot convert "all 932 million children, I swear" to a list. Task-number: QTCREATORBUG-22887 Change-Id: I3bf7e53c8b11ece3e1182d8446e959a66a41665a Reviewed-by: Christian Stenger --- share/qtcreator/debugger/gdbbridge.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/share/qtcreator/debugger/gdbbridge.py b/share/qtcreator/debugger/gdbbridge.py index 2f056c7a932..027560f333a 100644 --- a/share/qtcreator/debugger/gdbbridge.py +++ b/share/qtcreator/debugger/gdbbridge.py @@ -136,8 +136,6 @@ class PlainDumper: printer = self.printer.gen_printer(value.nativeValue) except: printer = self.printer.invoke(value.nativeValue) - lister = getattr(printer, 'children', None) - children = [] if lister is None else list(lister()) d.putType(value.nativeValue.type.name) val = printer.to_string() if isinstance(val, str): @@ -149,11 +147,20 @@ class PlainDumper: d.putCharArrayValue(val.address, val.length, val.type.target().sizeof) - d.putNumChild(len(children)) - if d.isExpanded(): - with Children(d): - for child in children: - d.putSubItem(child[0], d.fromNativeValue(gdb.Value(child[1]))) + lister = getattr(printer, 'children', None) + if lister is None: + d.putNumChild(0) + else: + if d.isExpanded(): + children = lister() + with Children(d): + i = 0 + for (name, child) in children: + d.putSubItem(name, d.fromNativeValue(child)) + i += 1 + if i > 1000: + break + d.putNumChild(1) def importPlainDumpers(args): if args == 'off':