diff options
author | hjk <hjk@qt.io> | 2016-12-02 09:06:05 +0100 |
---|---|---|
committer | hjk <hjk@qt.io> | 2016-12-02 13:26:00 +0000 |
commit | dc2724a3f72afbfde272b1640b9eea1a71cf8964 (patch) | |
tree | 1b8cae353d9f3e6167d8e0121aaaabb2e8e59d62 | |
parent | 349ad040d685ccdc288cd15c07eeca63013771e2 (diff) | |
download | qt-creator-dc2724a3f72afbfde272b1640b9eea1a71cf8964.tar.gz |
Debugger: Allow QObject property extraction without debug info
Task-number: QTCREATORBUG-16908
Change-Id: I1e1e9d91a6317808610f39868383b67e5c80a9a4
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
-rw-r--r-- | share/qtcreator/debugger/dumper.py | 33 | ||||
-rw-r--r-- | share/qtcreator/debugger/gdbbridge.py | 27 | ||||
-rw-r--r-- | share/qtcreator/debugger/lldbbridge.py | 4 |
3 files changed, 52 insertions, 12 deletions
diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index 3f820ddf9a..35abe174a7 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -254,6 +254,7 @@ class DumperBase: self.typesToReport = {} self.qtNamespaceToReport = None self.qtCustomEventFunc = 0 + self.qtPropertyFunc = 0 self.passExceptions = False self.isTesting = False @@ -1473,6 +1474,21 @@ class DumperBase: return self.qtCustomEventFunc == customEventFunc + def extractQObjectProperty(objectPtr): + vtablePtr = self.extractPointer(objectPtr) + metaObjectFunc = self.extractPointer(vtablePtr) + cmd = '((void*(*)(void*))0x%x)((void*)0x%x)' % (metaObjectFunc, objectPtr) + try: + #warn('MO CMD: %s' % cmd) + res = self.parseAndEvaluate(cmd) + #warn('MO RES: %s' % res) + self.bump('successfulMetaObjectCall') + return res.pointer() + except: + self.bump('failedMetaObjectCall') + #warn('COULD NOT EXECUTE: %s' % cmd) + return 0 + def extractMetaObjectPtr(self, objectPtr, typeobj): """ objectPtr - address of *potential* instance of QObject derived class typeobj - type of *objectPtr if known, None otherwise. """ @@ -1845,8 +1861,21 @@ class DumperBase: if qobject: # LLDB doesn't like calling it on a derived class, possibly # due to type information living in a different shared object. - base = self.createValue(qobjectPtr, '@QObject') - self.putCallItem(name, '@QVariant', base, 'property', '"' + name + '"') + #base = self.createValue(qobjectPtr, '@QObject') + #warn("CALL FUNC: 0x%x" % self.qtPropertyFunc) + cmd = '((QVariant(*)(void*,char*))0x%x)((void*)0x%x,"%s")' \ + % (self.qtPropertyFunc, qobjectPtr, name) + try: + #warn('PROP CMD: %s' % cmd) + res = self.parseAndEvaluate(cmd) + #warn('PROP RES: %s' % res) + except: + self.bump('failedMetaObjectCall') + putt(name, ' ') + continue + #warn('COULD NOT EXECUTE: %s' % cmd) + #self.putCallItem(name, '@QVariant', base, 'property', '"' + name + '"') + self.putSubItem(name, res) else: putt(name, ' ') diff --git a/share/qtcreator/debugger/gdbbridge.py b/share/qtcreator/debugger/gdbbridge.py index a84293d35c..43e234fa4d 100644 --- a/share/qtcreator/debugger/gdbbridge.py +++ b/share/qtcreator/debugger/gdbbridge.py @@ -1010,6 +1010,12 @@ class Dumper(DumperBase): self.ping('qtNamespace') return res + def findSymbol(self, symbolName): + try: + return toInteger(gdb.parse_and_eval('(size_t)&%s' % symbolName)) + except: + return 0 + def qtNamespaceX(self): if not self.currentQtNamespaceGuess is None: return self.currentQtNamespaceGuess @@ -1039,16 +1045,17 @@ class Dumper(DumperBase): except: pass - try: - lenns = len(ns) - if lenns: - sym = '_ZN%d%s7QObject11customEventEPNS_6QEventE' % \ - (lenns - 2, ns[:lenns - 2]) - else: - sym = '_ZN7QObject11customEventEP6QEvent' - self.qtCustomEventFunc = toInteger(gdb.parse_and_eval('(size_t)&%s' % sym)) - except: - pass + lenns = len(ns) + strns = ('%d%s' % (lenns - 2, ns[:lenns - 2])) if lenns else '' + + if lenns: + sym = '_ZN%s7QObject11customEventEPNS_6QEventE' % strns + else: + sym = '_ZN7QObject11customEventEP6QEvent' + self.qtCustomEventFunc = self.findSymbol(sym) + + sym = '_ZNK7%sQObject8propertyEPKc' % strns + self.qtPropertyFunc = self.findSymbol(sym) # This might be wrong, but we can't do better: We found # a libQt5Core and could not extract a namespace. diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py index 9ac37beeb6..bf3dae2f2d 100644 --- a/share/qtcreator/debugger/lldbbridge.py +++ b/share/qtcreator/debugger/lldbbridge.py @@ -684,6 +684,10 @@ class Dumper(DumperBase): symbol = funcs[0].GetSymbol() self.qtCustomEventFunc = symbol.GetStartAddress().GetLoadAddress(self.target) + funcs = self.target.FindFunctions('QObject::property') + if len(funcs): + symbol = funcs[0].GetSymbol() + self.qtPropertyFunc = symbol.GetStartAddress().GetLoadAddress(self.target) return (qtNamespace, qtVersion) return ('', 0x50200) |