forked from qt-creator/qt-creator
Debugger: Resolve dynamic types with LLDB if possible
Change-Id: I39b995eb9328e449befad85792512c45670cc8c9 Reviewed-by: hjk <hjk121@nokiamail.com>
This commit is contained in:
@@ -253,6 +253,10 @@ def createPointerValue(context, address, pointeeType):
|
|||||||
addr = int(address) & 0xFFFFFFFFFFFFFFFF
|
addr = int(address) & 0xFFFFFFFFFFFFFFFF
|
||||||
return context.CreateValueFromAddress(None, addr, pointeeType).AddressOf()
|
return context.CreateValueFromAddress(None, addr, pointeeType).AddressOf()
|
||||||
|
|
||||||
|
def createReferenceValue(context, address, referencedType):
|
||||||
|
addr = int(address) & 0xFFFFFFFFFFFFFFFF
|
||||||
|
return context.CreateValueFromAddress(None, addr, referencedType)
|
||||||
|
|
||||||
def impl_SBValue__add__(self, offset):
|
def impl_SBValue__add__(self, offset):
|
||||||
if self.GetType().IsPointerType():
|
if self.GetType().IsPointerType():
|
||||||
if isinstance(offset, int) or isinstance(offset, long):
|
if isinstance(offset, int) or isinstance(offset, long):
|
||||||
@@ -503,6 +507,12 @@ class SubItem:
|
|||||||
self.d.currentAddress = self.savedCurrentAddress
|
self.d.currentAddress = self.savedCurrentAddress
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
class UnnamedSubItem(SubItem):
|
||||||
|
def __init__(self, d, component):
|
||||||
|
self.d = d
|
||||||
|
self.iname = "%s.%s" % (self.d.currentIName, component)
|
||||||
|
self.name = None
|
||||||
|
|
||||||
class Dumper:
|
class Dumper:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.debugger = lldb.SBDebugger.Create()
|
self.debugger = lldb.SBDebugger.Create()
|
||||||
@@ -945,6 +955,7 @@ class Dumper:
|
|||||||
def putItem(self, value, tryDynamic=True):
|
def putItem(self, value, tryDynamic=True):
|
||||||
#value = value.GetDynamicValue(lldb.eDynamicCanRunTarget)
|
#value = value.GetDynamicValue(lldb.eDynamicCanRunTarget)
|
||||||
typeName = value.GetTypeName()
|
typeName = value.GetTypeName()
|
||||||
|
value.SetPreferDynamicValue(tryDynamic)
|
||||||
|
|
||||||
if tryDynamic:
|
if tryDynamic:
|
||||||
self.putAddress(value.address)
|
self.putAddress(value.address)
|
||||||
@@ -984,13 +995,9 @@ class Dumper:
|
|||||||
|
|
||||||
# References
|
# References
|
||||||
if value.GetType().IsReferenceType():
|
if value.GetType().IsReferenceType():
|
||||||
type = value.GetType().GetDereferencedType().GetPointerType()
|
|
||||||
# FIXME: Find something more direct.
|
|
||||||
origType = value.GetTypeName();
|
origType = value.GetTypeName();
|
||||||
value = value.CreateValueFromAddress(value.GetName(),
|
type = value.GetType().GetDereferencedType()
|
||||||
value.AddressOf().GetValueAsUnsigned(), type).Dereference()
|
self.putItem(createReferenceValue(value, value.GetAddress(), type))
|
||||||
#value = value.cast(value.dynamic_type)
|
|
||||||
self.putItem(value)
|
|
||||||
self.putBetterType(origType)
|
self.putBetterType(origType)
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -1039,9 +1046,16 @@ class Dumper:
|
|||||||
|
|
||||||
def putFields(self, value):
|
def putFields(self, value):
|
||||||
n = value.GetNumChildren()
|
n = value.GetNumChildren()
|
||||||
|
m = value.GetType().GetNumberOfDirectBaseClasses()
|
||||||
if n > 10000:
|
if n > 10000:
|
||||||
n = 10000
|
n = 10000
|
||||||
for i in xrange(n):
|
for i in xrange(m):
|
||||||
|
child = value.GetChildAtIndex(i)
|
||||||
|
with UnnamedSubItem(self, "@%d" % (i + 1)):
|
||||||
|
#self.put('iname="%s",' % self.currentIName)
|
||||||
|
self.put('name="[%s]",' % child.name)
|
||||||
|
self.putItem(child)
|
||||||
|
for i in xrange(m, n):
|
||||||
child = value.GetChildAtIndex(i)
|
child = value.GetChildAtIndex(i)
|
||||||
with SubItem(self, child):
|
with SubItem(self, child):
|
||||||
self.putItem(child)
|
self.putItem(child)
|
||||||
|
|||||||
Reference in New Issue
Block a user