diff options
author | hjk <hjk121@nokiamail.com> | 2014-04-03 11:23:31 +0200 |
---|---|---|
committer | Christian Stenger <christian.stenger@digia.com> | 2014-04-03 13:41:21 +0200 |
commit | b5f46788461ec96803d48797abe229ab57d996bc (patch) | |
tree | a62d8447361f98197fa327a6918161458945e211 /share | |
parent | 579da1faf1124a0d1ea42ac878d61b8d5171a533 (diff) |
Debugger: Handle failing inferior calls more gracefully
At least for GDB on Windows that's a rather typical situation due to
GDB's "Internal error: pc in read in psymtab, but not in symtab"
Task-number: QTCREATORBUG-11164
Change-Id: If79d586b59e2c1ee37558e8a811091fefc69ac2d
Reviewed-by: Christian Stenger <christian.stenger@digia.com>
Diffstat (limited to 'share')
-rw-r--r-- | share/qtcreator/debugger/dumper.py | 12 | ||||
-rw-r--r-- | share/qtcreator/debugger/gdbbridge.py | 10 | ||||
-rw-r--r-- | share/qtcreator/debugger/lldbbridge.py | 10 | ||||
-rw-r--r-- | share/qtcreator/debugger/qttypes.py | 11 |
4 files changed, 25 insertions, 18 deletions
diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index c4f061f813..326d34fd39 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -500,6 +500,18 @@ class DumperBase: self.putType(type) self.putNumChild(0) + def putCallItem(self, name, value, func, *args): + try: + result = self.callHelper(value, func, args) + with SubItem(self, name): + self.putItem(result) + except: + with SubItem(self, name): + self.putValue("<not callable>") + self.putNumChild(0) + + def call(self, value, func, *args): + return self.callHelper(value, func, args) def putMapName(self, value, index = -1): ns = self.qtNamespace() diff --git a/share/qtcreator/debugger/gdbbridge.py b/share/qtcreator/debugger/gdbbridge.py index 3593f8c75b..5ff97fdbf6 100644 --- a/share/qtcreator/debugger/gdbbridge.py +++ b/share/qtcreator/debugger/gdbbridge.py @@ -575,7 +575,7 @@ class Dumper(DumperBase): def parseAndEvaluate(self, exp): return gdb.parse_and_eval(exp) - def call2(self, value, func, args): + def callHelper(self, value, func, args): # args is a tuple. arg = "" for i in range(len(args)): @@ -602,9 +602,6 @@ class Dumper(DumperBase): gdb.parse_and_eval("free(0x%x)" % ptr) return result - def call(self, value, func, *args): - return self.call2(value, func, args) - def childWithName(self, value, name): try: return value[name] @@ -1054,11 +1051,6 @@ class Dumper(DumperBase): i = toInteger(i) self.putSubItem(i, (base + i).dereference()) - def putCallItem(self, name, value, func, *args): - result = self.call2(value, func, args) - with SubItem(self, name): - self.putItem(result) - def isFunctionType(self, type): return type.code == MethodCode or type.code == FunctionCode diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py index feda3ec82b..31065cdb77 100644 --- a/share/qtcreator/debugger/lldbbridge.py +++ b/share/qtcreator/debugger/lldbbridge.py @@ -372,7 +372,7 @@ class Dumper(DumperBase): return ns + "Qt::" + enumType + "(" \ + ns + "Qt::" + enumType + "::" + enumValue + ")" - def call2(self, value, func, args): + def callHelper(self, value, func, args): # args is a tuple. arg = ','.join(args) #warn("CALL: %s -> %s(%s)" % (value, func, arg)) @@ -398,9 +398,6 @@ class Dumper(DumperBase): frame = thread.GetFrameAtIndex(0) return frame.EvaluateExpression(expr) - def call(self, value, func, *args): - return self.call2(value, func, args) - def checkPointer(self, p, align = 1): if not self.isNull(p): p.Dereference() @@ -604,11 +601,6 @@ class Dumper(DumperBase): addr = int(address) & 0xFFFFFFFFFFFFFFFF return self.context.CreateValueFromAddress(None, addr, referencedType) - def putCallItem(self, name, value, func, *args): - result = self.call2(value, func, args) - with SubItem(self, name): - self.putItem(result) - def childRange(self): if self.currentMaxNumChild is None: return xrange(0, self.currentNumChild) diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py index 0b7a6f553d..0f45f3156e 100644 --- a/share/qtcreator/debugger/qttypes.py +++ b/share/qtcreator/debugger/qttypes.py @@ -179,6 +179,7 @@ def qdump__QModelIndex(d, value): % (mm_, row, column, mi_)) d.putItem(mi2) i = i + 1 + d.putFields(value) #d.putCallItem("parent", val, "parent") #with SubItem(d, "model"): # d.putValue(m) @@ -203,6 +204,7 @@ def qdump__QDate(d, value): d.enumExpression("DateFormat", "SystemLocaleDate")) d.putCallItem("(Locale)", value, "toString", d.enumExpression("DateFormat", "LocaleDate")) + d.putFields(value) else: d.putValue("(invalid)") d.putNumChild(0) @@ -224,6 +226,7 @@ def qdump__QTime(d, value): d.enumExpression("DateFormat", "SystemLocaleDate")) d.putCallItem("(Locale)", value, "toString", d.enumExpression("DateFormat", "LocaleDate")) + d.putFields(value) else: d.putValue("(invalid)") d.putNumChild(0) @@ -312,6 +315,7 @@ def qdump__QDateTime(d, value): d.enumExpression("TimeSpec", "UTC")) d.putCallItem("toLocalTime", value, "toTimeSpec", d.enumExpression("TimeSpec", "LocalTime")) + d.putFields(value) else: d.putValue("(invalid)") d.putNumChild(0) @@ -404,6 +408,7 @@ def qdump__QDir(d, value): with SubItem(d, "entryList"): typ = d.lookupType(ns + "QStringList") d.putItem(d.createValue(privAddress + filesOffset, typ)) + d.putFields(value) def qdump__QFile(d, value): @@ -510,6 +515,7 @@ def qdump__QFileInfo(d, value): d.putCallItem("created", value, "created") d.putCallItem("lastModified", value, "lastModified") d.putCallItem("lastRead", value, "lastRead") + d.putFields(value) def qdump__QFixed(d, value): @@ -919,6 +925,7 @@ def qdump__QLocale(d, value): d.putCallItem("zeroDigit", value, "zeroDigit") d.putCallItem("groupSeparator", value, "groupSeparator") d.putCallItem("negativeSign", value, "negativeSign") + d.putFields(value) def qdump__QMapNode(d, value): @@ -1804,6 +1811,7 @@ def qdump__QTextCodec(d, value): with Children(d): d.putCallItem("name", value, "name") d.putCallItem("mibEnum", value, "mibEnum") + d.putFields(value) def qdump__QTextCursor(d, value): @@ -1821,6 +1829,7 @@ def qdump__QTextCursor(d, value): d.putIntItem("position", d.extractInt(positionAddress)) d.putIntItem("anchor", d.extractInt(positionAddress + d.intSize())) d.putCallItem("selected", value, "selectedText") + d.putFields(value) def qdump__QTextDocument(d, value): @@ -1833,6 +1842,7 @@ def qdump__QTextDocument(d, value): d.putCallItem("lineCount", value, "lineCount") d.putCallItem("revision", value, "revision") d.putCallItem("toPlainText", value, "toPlainText") + d.putFields(value) def qform__QUrl(): @@ -1861,6 +1871,7 @@ def qdump__QUrl(d, value): d.putCallItem("query", value, "encodedQuery") d.putCallItem("fragment", value, "fragment") d.putCallItem("port", value, "port") + d.putFields(value) else: # QUrlPrivate: # - QAtomicInt ref; |