forked from qt-creator/qt-creator
Dumper: unify Codestyle
generated with autopep8 and the introduced setup.cfg Change-Id: I5b55a7937f2cde81be59d2b434e94ada1a4af5ab Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -25,6 +25,7 @@
|
||||
|
||||
from dumper import Children
|
||||
|
||||
|
||||
def qdump__boost__bimaps__bimap(d, value):
|
||||
#leftType = value.type[0]
|
||||
#rightType = value.type[1]
|
||||
@@ -64,7 +65,7 @@ def qdump__boost__shared_ptr(d, value):
|
||||
(vptr, usecount, weakcount) = d.split('pii', pi)
|
||||
d.check(weakcount >= 0)
|
||||
d.check(weakcount <= usecount)
|
||||
d.check(usecount <= 10*1000*1000)
|
||||
d.check(usecount <= 10 * 1000 * 1000)
|
||||
d.putItem(d.createValue(px, value.type[0]))
|
||||
d.putBetterType(value.type)
|
||||
|
||||
@@ -105,7 +106,7 @@ def qdump__boost__posix_time__time_duration(d, value):
|
||||
|
||||
def qdump__boost__unordered__unordered_set(d, value):
|
||||
innerType = value.type[0]
|
||||
if value.type.size() == 6 * d.ptrSize(): # 48 for boost 1.55+, 40 for 1.48
|
||||
if value.type.size() == 6 * d.ptrSize(): # 48 for boost 1.55+, 40 for 1.48
|
||||
# boost 1.58 or 1.55
|
||||
# bases are 3? bytes, and mlf is actually a float, but since
|
||||
# its followed by size_t maxload, it's # effectively padded to a size_t
|
||||
@@ -125,6 +126,7 @@ def qdump__boost__unordered__unordered_set(d, value):
|
||||
if forward:
|
||||
# boost 1.58
|
||||
code = 'pp{%s}' % innerType.name
|
||||
|
||||
def children(p):
|
||||
while True:
|
||||
p, dummy, val = d.split(code, p)
|
||||
@@ -134,12 +136,13 @@ def qdump__boost__unordered__unordered_set(d, value):
|
||||
code = '{%s}@p' % innerType.name
|
||||
(pp, ssize, fields) = d.describeStruct(code)
|
||||
offset = fields[2].offset()
|
||||
|
||||
def children(p):
|
||||
while True:
|
||||
val, pad, p = d.split(code, p - offset)
|
||||
yield val
|
||||
p = d.extractPointer(buckets + bucketCount * d.ptrSize())
|
||||
d.putItems(size, children(p), maxNumChild = 10000)
|
||||
d.putItems(size, children(p), maxNumChild=10000)
|
||||
|
||||
|
||||
def qdump__boost__variant(d, value):
|
||||
|
||||
@@ -35,8 +35,9 @@ sys.path.insert(1, os.path.dirname(os.path.abspath(inspect.getfile(inspect.curre
|
||||
|
||||
from dumper import DumperBase, SubItem
|
||||
|
||||
|
||||
class FakeVoidType(cdbext.Type):
|
||||
def __init__(self, name , dumper):
|
||||
def __init__(self, name, dumper):
|
||||
cdbext.Type.__init__(self)
|
||||
self.typeName = name.strip()
|
||||
self.dumper = dumper
|
||||
@@ -89,6 +90,7 @@ class FakeVoidType(cdbext.Type):
|
||||
def templateArguments(self):
|
||||
return []
|
||||
|
||||
|
||||
class Dumper(DumperBase):
|
||||
def __init__(self):
|
||||
DumperBase.__init__(self)
|
||||
@@ -114,7 +116,7 @@ class Dumper(DumperBase):
|
||||
elif integerString == 'false':
|
||||
val.ldata = int(0).to_bytes(1, byteorder='little')
|
||||
else:
|
||||
integerString = integerString.replace('`','')
|
||||
integerString = integerString.replace('`', '')
|
||||
integerString = integerString.split(' ')[0]
|
||||
if integerString.startswith('0n'):
|
||||
integerString = integerString[2:]
|
||||
@@ -125,8 +127,8 @@ class Dumper(DumperBase):
|
||||
base = 10
|
||||
signed = not val.type.name.startswith('unsigned')
|
||||
try:
|
||||
val.ldata = int(integerString, base).to_bytes(val.type.size(), \
|
||||
byteorder='little', signed=signed)
|
||||
val.ldata = int(integerString, base).to_bytes(val.type.size(),
|
||||
byteorder='little', signed=signed)
|
||||
except:
|
||||
# read raw memory in case the integerString can not be interpreted
|
||||
pass
|
||||
@@ -148,7 +150,8 @@ class Dumper(DumperBase):
|
||||
c = 'u'
|
||||
else:
|
||||
return name
|
||||
typeId = c + ''.join(['{%s:%s}' % (f.name(), self.nativeTypeId(f.type())) for f in nativeType.fields()])
|
||||
typeId = c + ''.join(['{%s:%s}' % (f.name(), self.nativeTypeId(f.type()))
|
||||
for f in nativeType.fields()])
|
||||
return typeId
|
||||
|
||||
def fromNativeType(self, nativeType):
|
||||
@@ -170,7 +173,8 @@ class Dumper(DumperBase):
|
||||
|
||||
if code == TypeCode.TypeCodeArray:
|
||||
# cdb reports virtual function tables as arrays those ar handled separetly by
|
||||
# the DumperBase. Declare those types as structs prevents a lookup to a none existing type
|
||||
# the DumperBase. Declare those types as structs prevents a lookup to a
|
||||
# none existing type
|
||||
if not nativeType.name().startswith('__fptr()') and not nativeType.name().startswith('<gentype '):
|
||||
targetType = self.lookupType(nativeType.targetName(), nativeType.moduleId())
|
||||
if targetType is not None:
|
||||
@@ -183,17 +187,17 @@ class Dumper(DumperBase):
|
||||
tdata.lbitsize = nativeType.bitsize()
|
||||
tdata.code = code
|
||||
tdata.moduleName = nativeType.module()
|
||||
self.registerType(typeId, tdata) # Prevent recursion in fields.
|
||||
if code == TypeCode.TypeCodeStruct:
|
||||
tdata.lfields = lambda value : \
|
||||
self.registerType(typeId, tdata) # Prevent recursion in fields.
|
||||
if code == TypeCode.TypeCodeStruct:
|
||||
tdata.lfields = lambda value: \
|
||||
self.listFields(nativeType, value)
|
||||
tdata.lalignment = lambda : \
|
||||
tdata.lalignment = lambda: \
|
||||
self.nativeStructAlignment(nativeType)
|
||||
if code == TypeCode.TypeCodeEnum:
|
||||
tdata.enumDisplay = lambda intval, addr, form : \
|
||||
tdata.enumDisplay = lambda intval, addr, form: \
|
||||
self.nativeTypeEnumDisplay(nativeType, intval, form)
|
||||
tdata.templateArguments = self.listTemplateParameters(nativeType.name())
|
||||
self.registerType(typeId, tdata) # Fix up fields and template args
|
||||
self.registerType(typeId, tdata) # Fix up fields and template args
|
||||
return self.Type(self, typeId)
|
||||
|
||||
def listFields(self, nativeType, value):
|
||||
@@ -320,14 +324,16 @@ class Dumper(DumperBase):
|
||||
if namespaceIndex > 0:
|
||||
namespace = name[:namespaceIndex + 2]
|
||||
self.qtNamespace = lambda: namespace
|
||||
self.qtCustomEventFunc = self.parseAndEvaluate('%s!%sQObject::customEvent'
|
||||
% (self.qtCoreModuleName(), namespace)).address()
|
||||
self.qtCustomEventFunc = self.parseAndEvaluate(
|
||||
'%s!%sQObject::customEvent' %
|
||||
(self.qtCoreModuleName(), namespace)).address()
|
||||
return namespace
|
||||
|
||||
def qtVersion(self):
|
||||
qtVersion = None
|
||||
try:
|
||||
qtVersion = self.parseAndEvaluate('((void**)&%s)[2]' % self.qtHookDataSymbolName()).integer()
|
||||
qtVersion = self.parseAndEvaluate(
|
||||
'((void**)&%s)[2]' % self.qtHookDataSymbolName()).integer()
|
||||
except:
|
||||
if self.qtCoreModuleName() is not None:
|
||||
try:
|
||||
@@ -391,7 +397,7 @@ class Dumper(DumperBase):
|
||||
else:
|
||||
return typeName
|
||||
|
||||
def lookupType(self, typeNameIn, module = 0):
|
||||
def lookupType(self, typeNameIn, module=0):
|
||||
if len(typeNameIn) == 0:
|
||||
return None
|
||||
typeName = self.stripQintTypedefs(typeNameIn)
|
||||
@@ -405,7 +411,7 @@ class Dumper(DumperBase):
|
||||
return type
|
||||
return self.Type(self, typeName)
|
||||
|
||||
def lookupNativeType(self, name, module = 0):
|
||||
def lookupNativeType(self, name, module=0):
|
||||
if name.startswith('void'):
|
||||
return FakeVoidType(name, self)
|
||||
return cdbext.lookupType(name, module)
|
||||
@@ -447,7 +453,7 @@ class Dumper(DumperBase):
|
||||
variables = []
|
||||
for val in cdbext.listOfLocals(self.partialVariable):
|
||||
dumperVal = self.fromNativeValue(val)
|
||||
dumperVal.lIsInScope = not dumperVal.name in self.uninitialized
|
||||
dumperVal.lIsInScope = dumperVal.name not in self.uninitialized
|
||||
variables.append(dumperVal)
|
||||
|
||||
self.handleLocals(variables)
|
||||
@@ -472,7 +478,7 @@ class Dumper(DumperBase):
|
||||
return cdbext.parseAndEvaluate(exp)
|
||||
|
||||
def nativeDynamicTypeName(self, address, baseType):
|
||||
return None # Does not work with cdb
|
||||
return None # Does not work with cdb
|
||||
|
||||
def nativeValueDereferenceReference(self, value):
|
||||
return self.nativeValueDereferencePointer(value)
|
||||
|
||||
@@ -23,15 +23,18 @@
|
||||
#
|
||||
############################################################################
|
||||
|
||||
|
||||
def typeTarget(type):
|
||||
target = type.target()
|
||||
if target:
|
||||
return target
|
||||
return type
|
||||
|
||||
|
||||
def stripTypeName(value):
|
||||
return typeTarget(value.type).unqualified().name
|
||||
|
||||
|
||||
def extractPointerType(d, value):
|
||||
postfix = ""
|
||||
while stripTypeName(value) == "CPlusPlus::PointerType":
|
||||
@@ -47,6 +50,7 @@ def extractPointerType(d, value):
|
||||
return "void" + postfix
|
||||
return "<unsupported>"
|
||||
|
||||
|
||||
def readTemplateName(d, value):
|
||||
name = readLiteral(d, value["_identifier"]) + "<"
|
||||
args = value["_templateArguments"]
|
||||
@@ -65,6 +69,7 @@ def readTemplateName(d, value):
|
||||
name += ">"
|
||||
return name
|
||||
|
||||
|
||||
def readLiteral(d, value):
|
||||
if not value.integer():
|
||||
return "<null>"
|
||||
@@ -78,9 +83,11 @@ def readLiteral(d, value):
|
||||
except:
|
||||
return "<unsupported>"
|
||||
|
||||
|
||||
def dumpLiteral(d, value):
|
||||
d.putValue(d.hexencode(readLiteral(d, value)), "latin1")
|
||||
|
||||
|
||||
def qdump__Core__Id(d, value):
|
||||
val = value.extractPointer()
|
||||
if True:
|
||||
@@ -93,36 +100,44 @@ def qdump__Core__Id(d, value):
|
||||
d.putValue(val)
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__Debugger__Internal__GdbMi(d, value):
|
||||
val = d.encodeString(value["m_name"]) + "3a002000" \
|
||||
+ d.encodeString(value["m_data"])
|
||||
d.putValue(val, "utf16")
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__Debugger__Internal__DisassemblerLine(d, value):
|
||||
d.putByteArrayValue(value["m_data"])
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__Debugger__Internal__WatchData(d, value):
|
||||
d.putStringValue(value["iname"])
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__Debugger__Internal__WatchItem(d, value):
|
||||
d.putStringValue(value["iname"])
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__Debugger__Internal__BreakpointModelId(d, value):
|
||||
d.putValue("%s.%s" % (value["m_majorPart"].integer(), value["m_minorPart"].integer()))
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__Debugger__Internal__ThreadId(d, value):
|
||||
d.putValue("%s" % value["m_id"])
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__CPlusPlus__ByteArrayRef(d, value):
|
||||
d.putSimpleCharArray(value["m_start"], value["m_length"])
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__CPlusPlus__Identifier(d, value):
|
||||
try:
|
||||
d.putSimpleCharArray(value["_chars"], value["_size"])
|
||||
@@ -130,14 +145,17 @@ def qdump__CPlusPlus__Identifier(d, value):
|
||||
pass
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__CPlusPlus__Symbol(d, value):
|
||||
dumpLiteral(d, value["_name"])
|
||||
d.putBetterType(value.type)
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__CPlusPlus__Class(d, value):
|
||||
qdump__CPlusPlus__Symbol(d, value)
|
||||
|
||||
|
||||
def kindName(d, value):
|
||||
e = value.integer()
|
||||
if e:
|
||||
@@ -146,10 +164,12 @@ def kindName(d, value):
|
||||
else:
|
||||
return ''
|
||||
|
||||
|
||||
def qdump__CPlusPlus__IntegerType(d, value):
|
||||
d.putValue(kindName(d, value["_kind"]))
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__CPlusPlus__FullySpecifiedType(d, value):
|
||||
type = value["_type"]
|
||||
typeName = stripTypeName(type)
|
||||
@@ -159,36 +179,44 @@ def qdump__CPlusPlus__FullySpecifiedType(d, value):
|
||||
d.putValue(d.hexencode(extractPointerType(d, type)), "latin1")
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__CPlusPlus__NamedType(d, value):
|
||||
dumpLiteral(d, value["_name"])
|
||||
d.putBetterType(value.type)
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__CPlusPlus__PointerType(d, value):
|
||||
d.putValue(d.hexencode(extractPointerType(d, value)), "latin1")
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__CPlusPlus__TemplateNameId(d, value):
|
||||
dumpLiteral(d, value)
|
||||
d.putBetterType(value.type)
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__CPlusPlus__QualifiedNameId(d, value):
|
||||
dumpLiteral(d, value)
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__CPlusPlus__Literal(d, value):
|
||||
dumpLiteral(d, value)
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__CPlusPlus__StringLiteral(d, value):
|
||||
d.putSimpleCharArray(value["_chars"], value["_size"])
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__CPlusPlus__Internal__Value(d, value):
|
||||
d.putValue(value["l"])
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__Utils__FilePath(d, value):
|
||||
try:
|
||||
if not d.extractPointer(value["m_url"]): # there is no valid URL
|
||||
@@ -199,21 +227,26 @@ def qdump__Utils__FilePath(d, value):
|
||||
d.putStringValue(value) # support FileName before 4.10 as well
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__Utils__FileName(d, value):
|
||||
qdump__Utils__FilePath(d, value)
|
||||
|
||||
|
||||
def qdump__Utils__ElfSection(d, value):
|
||||
d.putByteArrayValue(value["name"])
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__Utils__Port(d, value):
|
||||
d.putValue(d.extractInt(value))
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__Utf8String(d, value):
|
||||
d.putByteArrayValue(value['byteArray'])
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__CPlusPlus__Token(d, value):
|
||||
k = value["f"]["kind"]
|
||||
e = k.lvalue
|
||||
@@ -228,6 +261,7 @@ def qdump__CPlusPlus__Token(d, value):
|
||||
d.putValue(type)
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__CPlusPlus__Internal__PPToken(d, value):
|
||||
data, size, alloc = d.byteArrayData(value["m_src"])
|
||||
length = value["f"]["utf16chars"].integer()
|
||||
@@ -237,6 +271,7 @@ def qdump__CPlusPlus__Internal__PPToken(d, value):
|
||||
d.putValue(d.readMemory(data + offset, min(100, length)), "latin1")
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__ProString(d, value):
|
||||
try:
|
||||
s = value["m_string"]
|
||||
@@ -249,10 +284,12 @@ def qdump__ProString(d, value):
|
||||
d.putEmptyValue()
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__ProKey(d, value):
|
||||
qdump__ProString(d, value)
|
||||
d.putBetterType(value.type)
|
||||
|
||||
|
||||
def qdump__Core__GeneratedFile(d, value):
|
||||
d.putStringValue(value["m_d"]["d"]["path"])
|
||||
d.putPlainChildren(value)
|
||||
@@ -275,14 +312,18 @@ def qdump__Core__GeneratedFile(d, value):
|
||||
# d.putStringValue(value["d"]["m_unexpandedDisplayName"])
|
||||
# d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__ProjectExplorer__ProjectNode(d, value):
|
||||
qdump__ProjectExplorer__FolderNode(d, value)
|
||||
|
||||
|
||||
def qdump__CMakeProjectManager__Internal__CMakeProjectNode(d, value):
|
||||
qdump__ProjectExplorer__FolderNode(d, value)
|
||||
|
||||
|
||||
def qdump__QmakeProjectManager__QmakePriFileNode(d, value):
|
||||
qdump__ProjectExplorer__FolderNode(d, value)
|
||||
|
||||
|
||||
def qdump__QmakeProjectManager__QmakeProFileNode(d, value):
|
||||
qdump__ProjectExplorer__FolderNode(d, value)
|
||||
|
||||
+271
-229
File diff suppressed because it is too large
Load Diff
@@ -46,6 +46,7 @@ from utils import TypeCode
|
||||
#
|
||||
#######################################################################
|
||||
|
||||
|
||||
def safePrint(output):
|
||||
try:
|
||||
print(output)
|
||||
@@ -61,18 +62,19 @@ def safePrint(output):
|
||||
out += c
|
||||
print(out)
|
||||
|
||||
|
||||
def registerCommand(name, func):
|
||||
|
||||
class Command(gdb.Command):
|
||||
def __init__(self):
|
||||
super(Command, self).__init__(name, gdb.COMMAND_OBSCURE)
|
||||
|
||||
def invoke(self, args, from_tty):
|
||||
safePrint(func(args))
|
||||
|
||||
Command()
|
||||
|
||||
|
||||
|
||||
#######################################################################
|
||||
#
|
||||
# Convenience
|
||||
@@ -83,18 +85,24 @@ def registerCommand(name, func):
|
||||
class PPCommand(gdb.Command):
|
||||
def __init__(self):
|
||||
super(PPCommand, self).__init__('pp', gdb.COMMAND_OBSCURE)
|
||||
|
||||
def invoke(self, args, from_tty):
|
||||
print(theCliDumper.fetchVariable(args))
|
||||
|
||||
|
||||
PPCommand()
|
||||
|
||||
# Just convenience for 'python print gdb.parse_and_eval(...)'
|
||||
|
||||
|
||||
class PPPCommand(gdb.Command):
|
||||
def __init__(self):
|
||||
super(PPPCommand, self).__init__('ppp', gdb.COMMAND_OBSCURE)
|
||||
|
||||
def invoke(self, args, from_tty):
|
||||
print(gdb.parse_and_eval(args))
|
||||
|
||||
|
||||
PPPCommand()
|
||||
|
||||
|
||||
@@ -109,14 +117,17 @@ def scanStack(p, n):
|
||||
p += f.type.sizeof
|
||||
return r
|
||||
|
||||
|
||||
class ScanStackCommand(gdb.Command):
|
||||
def __init__(self):
|
||||
super(ScanStackCommand, self).__init__('scanStack', gdb.COMMAND_OBSCURE)
|
||||
|
||||
def invoke(self, args, from_tty):
|
||||
if len(args) == 0:
|
||||
args = 20
|
||||
safePrint(scanStack(gdb.parse_and_eval('$sp'), int(args)))
|
||||
|
||||
|
||||
ScanStackCommand()
|
||||
|
||||
|
||||
@@ -126,7 +137,7 @@ ScanStackCommand()
|
||||
#
|
||||
#######################################################################
|
||||
|
||||
class PlainDumper:
|
||||
class PlainDumper():
|
||||
def __init__(self, printer):
|
||||
self.printer = printer
|
||||
self.typeCache = {}
|
||||
@@ -143,7 +154,7 @@ class PlainDumper:
|
||||
d.putValue(d.hexencode(val), 'utf8:1:0')
|
||||
elif sys.version_info[0] <= 2 and isinstance(val, unicode):
|
||||
d.putValue(val)
|
||||
elif val is not None: # Assuming LazyString
|
||||
elif val is not None: # Assuming LazyString
|
||||
d.putCharArrayValue(val.address, val.length,
|
||||
val.type.target().sizeof)
|
||||
|
||||
@@ -162,6 +173,7 @@ class PlainDumper:
|
||||
break
|
||||
d.putNumChild(1)
|
||||
|
||||
|
||||
def importPlainDumpers(args):
|
||||
if args == 'off':
|
||||
try:
|
||||
@@ -172,11 +184,11 @@ def importPlainDumpers(args):
|
||||
else:
|
||||
theDumper.importPlainDumpers()
|
||||
|
||||
|
||||
registerCommand('importPlainDumpers', importPlainDumpers)
|
||||
|
||||
|
||||
|
||||
class OutputSaver:
|
||||
class OutputSaver():
|
||||
def __init__(self, d):
|
||||
self.d = d
|
||||
|
||||
@@ -185,7 +197,7 @@ class OutputSaver:
|
||||
self.d.output = ''
|
||||
|
||||
def __exit__(self, exType, exValue, exTraceBack):
|
||||
if self.d.passExceptions and not exType is None:
|
||||
if self.d.passExceptions and exType is not None:
|
||||
self.d.showException('OUTPUTSAVER', exType, exValue, exTraceBack)
|
||||
self.d.output = self.savedOutput
|
||||
else:
|
||||
@@ -194,7 +206,6 @@ class OutputSaver:
|
||||
return False
|
||||
|
||||
|
||||
|
||||
#######################################################################
|
||||
#
|
||||
# The Dumper Class
|
||||
@@ -220,9 +231,9 @@ class Dumper(DumperBase):
|
||||
#DumperBase.warn('FROM FRAME VALUE: %s' % nativeValue.address)
|
||||
val = nativeValue
|
||||
try:
|
||||
val = nativeValue.cast(nativeValue.dynamic_type)
|
||||
val = nativeValue.cast(nativeValue.dynamic_type)
|
||||
except:
|
||||
pass
|
||||
pass
|
||||
return self.fromNativeValue(val)
|
||||
|
||||
def fromNativeValue(self, nativeValue):
|
||||
@@ -249,7 +260,7 @@ class Dumper(DumperBase):
|
||||
# is surprisingly expensive.
|
||||
val.nativeValue = nativeValue
|
||||
#DumperBase.warn('CREATED PTR 1: %s' % val)
|
||||
if not nativeValue.address is None:
|
||||
if nativeValue.address is not None:
|
||||
val.laddress = toInteger(nativeValue.address)
|
||||
#DumperBase.warn('CREATED PTR 2: %s' % val)
|
||||
return val
|
||||
@@ -272,7 +283,7 @@ class Dumper(DumperBase):
|
||||
val = self.Value(self)
|
||||
|
||||
val.nativeValue = nativeValue
|
||||
if not nativeValue.address is None:
|
||||
if nativeValue.address is not None:
|
||||
val.laddress = toInteger(nativeValue.address)
|
||||
else:
|
||||
size = nativeType.sizeof
|
||||
@@ -356,34 +367,34 @@ class Dumper(DumperBase):
|
||||
tdata.lbitsize = nativeType.sizeof * 8
|
||||
tdata.code = {
|
||||
#gdb.TYPE_CODE_TYPEDEF : TypeCodeTypedef, # Handled above.
|
||||
gdb.TYPE_CODE_METHOD : TypeCode.TypeCodeFunction,
|
||||
gdb.TYPE_CODE_VOID : TypeCode.TypeCodeVoid,
|
||||
gdb.TYPE_CODE_FUNC : TypeCode.TypeCodeFunction,
|
||||
gdb.TYPE_CODE_METHODPTR : TypeCode.TypeCodeFunction,
|
||||
gdb.TYPE_CODE_MEMBERPTR : TypeCode.TypeCodeFunction,
|
||||
gdb.TYPE_CODE_METHOD: TypeCode.TypeCodeFunction,
|
||||
gdb.TYPE_CODE_VOID: TypeCode.TypeCodeVoid,
|
||||
gdb.TYPE_CODE_FUNC: TypeCode.TypeCodeFunction,
|
||||
gdb.TYPE_CODE_METHODPTR: TypeCode.TypeCodeFunction,
|
||||
gdb.TYPE_CODE_MEMBERPTR: TypeCode.TypeCodeFunction,
|
||||
#gdb.TYPE_CODE_PTR : TypeCode.TypeCodePointer, # Handled above.
|
||||
#gdb.TYPE_CODE_REF : TypeCode.TypeCodeReference, # Handled above.
|
||||
gdb.TYPE_CODE_BOOL : TypeCode.TypeCodeIntegral,
|
||||
gdb.TYPE_CODE_CHAR : TypeCode.TypeCodeIntegral,
|
||||
gdb.TYPE_CODE_INT : TypeCode.TypeCodeIntegral,
|
||||
gdb.TYPE_CODE_FLT : TypeCode.TypeCodeFloat,
|
||||
gdb.TYPE_CODE_ENUM : TypeCode.TypeCodeEnum,
|
||||
gdb.TYPE_CODE_BOOL: TypeCode.TypeCodeIntegral,
|
||||
gdb.TYPE_CODE_CHAR: TypeCode.TypeCodeIntegral,
|
||||
gdb.TYPE_CODE_INT: TypeCode.TypeCodeIntegral,
|
||||
gdb.TYPE_CODE_FLT: TypeCode.TypeCodeFloat,
|
||||
gdb.TYPE_CODE_ENUM: TypeCode.TypeCodeEnum,
|
||||
#gdb.TYPE_CODE_ARRAY : TypeCode.TypeCodeArray,
|
||||
gdb.TYPE_CODE_STRUCT : TypeCode.TypeCodeStruct,
|
||||
gdb.TYPE_CODE_UNION : TypeCode.TypeCodeStruct,
|
||||
gdb.TYPE_CODE_COMPLEX : TypeCode.TypeCodeComplex,
|
||||
gdb.TYPE_CODE_STRING : TypeCode.TypeCodeFortranString,
|
||||
gdb.TYPE_CODE_STRUCT: TypeCode.TypeCodeStruct,
|
||||
gdb.TYPE_CODE_UNION: TypeCode.TypeCodeStruct,
|
||||
gdb.TYPE_CODE_COMPLEX: TypeCode.TypeCodeComplex,
|
||||
gdb.TYPE_CODE_STRING: TypeCode.TypeCodeFortranString,
|
||||
}[code]
|
||||
if tdata.code == TypeCode.TypeCodeEnum:
|
||||
tdata.enumDisplay = lambda intval, addr, form : \
|
||||
tdata.enumDisplay = lambda intval, addr, form: \
|
||||
self.nativeTypeEnumDisplay(nativeType, intval, form)
|
||||
if tdata.code == TypeCode.TypeCodeStruct:
|
||||
tdata.lalignment = lambda : \
|
||||
tdata.lalignment = lambda: \
|
||||
self.nativeStructAlignment(nativeType)
|
||||
tdata.lfields = lambda value : \
|
||||
tdata.lfields = lambda value: \
|
||||
self.listMembers(value, nativeType)
|
||||
tdata.templateArguments = self.listTemplateParameters(nativeType)
|
||||
self.registerType(typeId, tdata) # Fix up fields and template args
|
||||
self.registerType(typeId, tdata) # Fix up fields and template args
|
||||
# warn('CREATE TYPE: %s' % typeId)
|
||||
#else:
|
||||
# warn('REUSE TYPE: %s' % typeId)
|
||||
@@ -417,7 +428,7 @@ class Dumper(DumperBase):
|
||||
enumerators.append((field.name, field.enumval))
|
||||
|
||||
# No match was found, try to return as flags
|
||||
enumerators.sort(key = lambda x: x[1])
|
||||
enumerators.sort(key=lambda x: x[1])
|
||||
flags = []
|
||||
v = intval
|
||||
found = False
|
||||
@@ -460,16 +471,14 @@ class Dumper(DumperBase):
|
||||
align = handleItem(f.type, align)
|
||||
return align
|
||||
|
||||
|
||||
#except:
|
||||
# # Happens in the BoostList dumper for a 'const bool'
|
||||
# # item named 'constant_time_size'. There isn't anything we can do
|
||||
# # in this case.
|
||||
# pass
|
||||
# pass
|
||||
|
||||
#yield value.extractField(field)
|
||||
|
||||
|
||||
def memberFromNativeFieldAndValue(self, nativeField, nativeValue, fieldName, value):
|
||||
nativeMember = self.nativeMemberFromField(nativeValue, nativeField)
|
||||
if nativeMember is None:
|
||||
@@ -554,9 +563,9 @@ class Dumper(DumperBase):
|
||||
extractor = None
|
||||
else:
|
||||
extractor = lambda value, \
|
||||
capturedNativeField = nativeField, \
|
||||
capturedNativeValue = nativeValue, \
|
||||
capturedFieldName = fieldName : \
|
||||
capturedNativeField = nativeField, \
|
||||
capturedNativeValue = nativeValue, \
|
||||
capturedFieldName = fieldName: \
|
||||
self.memberFromNativeFieldAndValue(capturedNativeField,
|
||||
capturedNativeValue,
|
||||
capturedFieldName,
|
||||
@@ -564,10 +573,8 @@ class Dumper(DumperBase):
|
||||
|
||||
#DumperBase.warn("FOUND NATIVE FIELD: %s bitpos: %s" % (fieldName, bitpos))
|
||||
return self.Field(dumper=self, name=fieldName, isBase=nativeField.is_base_class,
|
||||
bitsize=bitsize, bitpos=bitpos, type=fieldType,
|
||||
extractor=extractor)
|
||||
|
||||
|
||||
bitsize=bitsize, bitpos=bitpos, type=fieldType,
|
||||
extractor=extractor)
|
||||
|
||||
def listLocals(self, partialVar):
|
||||
frame = gdb.selected_frame()
|
||||
@@ -590,67 +597,67 @@ class Dumper(DumperBase):
|
||||
break
|
||||
for symbol in block:
|
||||
|
||||
# Filter out labels etc.
|
||||
if symbol.is_variable or symbol.is_argument:
|
||||
name = symbol.print_name
|
||||
# Filter out labels etc.
|
||||
if symbol.is_variable or symbol.is_argument:
|
||||
name = symbol.print_name
|
||||
|
||||
if name in ('__in_chrg', '__PRETTY_FUNCTION__'):
|
||||
continue
|
||||
if name in ('__in_chrg', '__PRETTY_FUNCTION__'):
|
||||
continue
|
||||
|
||||
if not partialVar is None and partialVar != name:
|
||||
continue
|
||||
if partialVar is not None and partialVar != name:
|
||||
continue
|
||||
|
||||
# 'NotImplementedError: Symbol type not yet supported in
|
||||
# Python scripts.'
|
||||
#DumperBase.warn('SYMBOL %s (%s, %s)): ' % (symbol, name, symbol.name))
|
||||
if self.passExceptions and not self.isTesting:
|
||||
nativeValue = frame.read_var(name, block)
|
||||
value = self.fromFrameValue(nativeValue)
|
||||
value.name = name
|
||||
#DumperBase.warn('READ 0: %s' % value.stringify())
|
||||
items.append(value)
|
||||
continue
|
||||
# 'NotImplementedError: Symbol type not yet supported in
|
||||
# Python scripts.'
|
||||
#DumperBase.warn('SYMBOL %s (%s, %s)): ' % (symbol, name, symbol.name))
|
||||
if self.passExceptions and not self.isTesting:
|
||||
nativeValue = frame.read_var(name, block)
|
||||
value = self.fromFrameValue(nativeValue)
|
||||
value.name = name
|
||||
#DumperBase.warn('READ 0: %s' % value.stringify())
|
||||
items.append(value)
|
||||
continue
|
||||
|
||||
try:
|
||||
# Same as above, but for production.
|
||||
nativeValue = frame.read_var(name, block)
|
||||
value = self.fromFrameValue(nativeValue)
|
||||
value.name = name
|
||||
#DumperBase.warn('READ 1: %s' % value.stringify())
|
||||
items.append(value)
|
||||
continue
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
# Same as above, but for production.
|
||||
nativeValue = frame.read_var(name, block)
|
||||
value = self.fromFrameValue(nativeValue)
|
||||
value.name = name
|
||||
#DumperBase.warn('READ 1: %s' % value.stringify())
|
||||
items.append(value)
|
||||
continue
|
||||
except:
|
||||
pass
|
||||
|
||||
try:
|
||||
#DumperBase.warn('READ 2: %s' % item.value)
|
||||
value = self.fromFrameValue(frame.read_var(name))
|
||||
value.name = name
|
||||
items.append(value)
|
||||
continue
|
||||
except:
|
||||
# RuntimeError: happens for
|
||||
# void foo() { std::string s; std::wstring w; }
|
||||
# ValueError: happens for (as of 2010/11/4)
|
||||
# a local struct as found e.g. in
|
||||
# gcc sources in gcc.c, int execute()
|
||||
pass
|
||||
try:
|
||||
#DumperBase.warn('READ 2: %s' % item.value)
|
||||
value = self.fromFrameValue(frame.read_var(name))
|
||||
value.name = name
|
||||
items.append(value)
|
||||
continue
|
||||
except:
|
||||
# RuntimeError: happens for
|
||||
# void foo() { std::string s; std::wstring w; }
|
||||
# ValueError: happens for (as of 2010/11/4)
|
||||
# a local struct as found e.g. in
|
||||
# gcc sources in gcc.c, int execute()
|
||||
pass
|
||||
|
||||
try:
|
||||
#DumperBase.warn('READ 3: %s %s' % (name, item.value))
|
||||
#DumperBase.warn('ITEM 3: %s' % item.value)
|
||||
value = self.fromFrameValue(gdb.parse_and_eval(name))
|
||||
value.name = name
|
||||
items.append(value)
|
||||
except:
|
||||
# Can happen in inlined code (see last line of
|
||||
# RowPainter::paintChars(): 'RuntimeError:
|
||||
# No symbol '__val' in current context.\n'
|
||||
pass
|
||||
try:
|
||||
#DumperBase.warn('READ 3: %s %s' % (name, item.value))
|
||||
#DumperBase.warn('ITEM 3: %s' % item.value)
|
||||
value = self.fromFrameValue(gdb.parse_and_eval(name))
|
||||
value.name = name
|
||||
items.append(value)
|
||||
except:
|
||||
# Can happen in inlined code (see last line of
|
||||
# RowPainter::paintChars(): 'RuntimeError:
|
||||
# No symbol '__val' in current context.\n'
|
||||
pass
|
||||
|
||||
# The outermost block in a function has the function member
|
||||
# FIXME: check whether this is guaranteed.
|
||||
if not block.function is None:
|
||||
if block.function is not None:
|
||||
break
|
||||
|
||||
block = block.superblock
|
||||
@@ -670,7 +677,7 @@ class Dumper(DumperBase):
|
||||
self.resetStats()
|
||||
self.prepare(args)
|
||||
|
||||
self.isBigEndian = gdb.execute('show endian', to_string = True).find('big endian') > 0
|
||||
self.isBigEndian = gdb.execute('show endian', to_string=True).find('big endian') > 0
|
||||
self.packCode = '>' if self.isBigEndian else '<'
|
||||
|
||||
(ok, res) = self.tryFetchInterpreterVariables(args)
|
||||
@@ -757,7 +764,7 @@ class Dumper(DumperBase):
|
||||
#exp = '((class %s*)%s)->%s(%s)' % (typeName, value.laddress, function, arg)
|
||||
addr = value.address()
|
||||
if addr is None:
|
||||
addr = self.pokeValue(value)
|
||||
addr = self.pokeValue(value)
|
||||
#DumperBase.warn('PTR: %s -> %s(%s)' % (value, function, addr))
|
||||
exp = '((%s*)0x%x)->%s(%s)' % (typeName, addr, function, arg)
|
||||
#DumperBase.warn('CALL: %s' % exp)
|
||||
@@ -777,9 +784,9 @@ class Dumper(DumperBase):
|
||||
|
||||
def makeStdString(init):
|
||||
# Works only for small allocators, but they are usually empty.
|
||||
gdb.execute('set $d=(std::string*)calloc(sizeof(std::string), 2)');
|
||||
gdb.execute('set $d=(std::string*)calloc(sizeof(std::string), 2)')
|
||||
gdb.execute('call($d->basic_string("' + init +
|
||||
'",*(std::allocator<char>*)(1+$d)))')
|
||||
'",*(std::allocator<char>*)(1+$d)))')
|
||||
value = gdb.parse_and_eval('$d').dereference()
|
||||
return value
|
||||
|
||||
@@ -791,7 +798,7 @@ class Dumper(DumperBase):
|
||||
data = value.data()
|
||||
h = self.hexencode(data)
|
||||
#DumperBase.warn('DATA: %s' % h)
|
||||
string = ''.join('\\x' + h[2*i:2*i+2] for i in range(size))
|
||||
string = ''.join('\\x' + h[2 * i:2 * i + 2] for i in range(size))
|
||||
exp = '(%s*)memcpy(calloc(%d, 1), "%s", %d)' \
|
||||
% (value.type.name, size, string, size)
|
||||
#DumperBase.warn('EXP: %s' % exp)
|
||||
@@ -886,7 +893,7 @@ class Dumper(DumperBase):
|
||||
|
||||
try:
|
||||
version = self.qtVersionString()
|
||||
(major, minor, patch) = version[version.find('"')+1:version.rfind('"')].split('.')
|
||||
(major, minor, patch) = version[version.find('"') + 1:version.rfind('"')].split('.')
|
||||
qtversion = 0x10000 * int(major) + 0x100 * int(minor) + int(patch)
|
||||
self.qtVersion = lambda: qtversion
|
||||
return qtversion
|
||||
@@ -896,6 +903,7 @@ class Dumper(DumperBase):
|
||||
|
||||
def createSpecialBreakpoints(self, args):
|
||||
self.specialBreakpoints = []
|
||||
|
||||
def newSpecial(spec):
|
||||
# GDB < 8.1 does not have the 'qualified' parameter here,
|
||||
# GDB >= 8.1 applies some generous pattern matching, hitting
|
||||
@@ -903,7 +911,7 @@ class Dumper(DumperBase):
|
||||
class Pre81SpecialBreakpoint(gdb.Breakpoint):
|
||||
def __init__(self, spec):
|
||||
super(Pre81SpecialBreakpoint, self).__init__(spec,
|
||||
gdb.BP_BREAKPOINT, internal=True)
|
||||
gdb.BP_BREAKPOINT, internal=True)
|
||||
self.spec = spec
|
||||
|
||||
def stop(self):
|
||||
@@ -913,7 +921,9 @@ class Dumper(DumperBase):
|
||||
class SpecialBreakpoint(gdb.Breakpoint):
|
||||
def __init__(self, spec):
|
||||
super(SpecialBreakpoint, self).__init__(spec,
|
||||
gdb.BP_BREAKPOINT, internal=True, qualified=True)
|
||||
gdb.BP_BREAKPOINT,
|
||||
internal=True,
|
||||
qualified=True)
|
||||
self.spec = spec
|
||||
|
||||
def stop(self):
|
||||
@@ -999,7 +1009,6 @@ class Dumper(DumperBase):
|
||||
# oldthread.switch()
|
||||
#return out + ']'
|
||||
|
||||
|
||||
def importPlainDumper(self, printer):
|
||||
name = printer.name.replace('::', '__')
|
||||
self.qqDumpers[name] = PlainDumper(printer)
|
||||
@@ -1024,9 +1033,9 @@ class Dumper(DumperBase):
|
||||
def handleNewObjectFile(self, objfile):
|
||||
name = objfile.filename
|
||||
if self.isWindowsTarget():
|
||||
qtCoreMatch = re.match('.*Qt5?Core[^/.]*d?\.dll', name)
|
||||
qtCoreMatch = re.match(r'.*Qt5?Core[^/.]*d?\.dll', name)
|
||||
else:
|
||||
qtCoreMatch = re.match('.*/libQt5?Core[^/.]*\.so', name)
|
||||
qtCoreMatch = re.match(r'.*/libQt5?Core[^/.]*\.so', name)
|
||||
|
||||
if qtCoreMatch is not None:
|
||||
self.addDebugLibs(objfile)
|
||||
@@ -1043,18 +1052,17 @@ class Dumper(DumperBase):
|
||||
except:
|
||||
pass
|
||||
|
||||
|
||||
def handleQtCoreLoaded(self, objfile):
|
||||
fd, tmppath = tempfile.mkstemp()
|
||||
os.close(fd)
|
||||
cmd = 'maint print msymbols %s "%s"' % (tmppath, objfile.filename)
|
||||
try:
|
||||
symbols = gdb.execute(cmd, to_string = True)
|
||||
symbols = gdb.execute(cmd, to_string=True)
|
||||
except:
|
||||
# command syntax depends on gdb version - below is gdb 8+
|
||||
cmd = 'maint print msymbols -objfile "%s" -- %s' % (objfile.filename, tmppath)
|
||||
try:
|
||||
symbols = gdb.execute(cmd, to_string = True)
|
||||
symbols = gdb.execute(cmd, to_string=True)
|
||||
except:
|
||||
pass
|
||||
ns = ''
|
||||
@@ -1063,14 +1071,14 @@ class Dumper(DumperBase):
|
||||
if line.find('msgHandlerGrabbed ') >= 0:
|
||||
# [11] b 0x7ffff683c000 _ZN4MynsL17msgHandlerGrabbedE
|
||||
# section .tbss Myns::msgHandlerGrabbed qlogging.cpp
|
||||
ns = re.split('_ZN?(\d*)(\w*)L17msgHandlerGrabbedE? ', line)[2]
|
||||
ns = re.split(r'_ZN?(\d*)(\w*)L17msgHandlerGrabbedE? ', line)[2]
|
||||
if len(ns):
|
||||
ns += '::'
|
||||
break
|
||||
if line.find('currentThreadData ') >= 0:
|
||||
# [ 0] b 0x7ffff67d3000 _ZN2UUL17currentThreadDataE
|
||||
# section .tbss UU::currentThreadData qthread_unix.cpp\\n
|
||||
ns = re.split('_ZN?(\d*)(\w*)L17currentThreadDataE? ', line)[2]
|
||||
ns = re.split(r'_ZN?(\d*)(\w*)L17currentThreadDataE? ', line)[2]
|
||||
if len(ns):
|
||||
ns += '::'
|
||||
break
|
||||
@@ -1179,14 +1187,14 @@ class Dumper(DumperBase):
|
||||
|
||||
def lookupNativeType(self, typeName):
|
||||
nativeType = self.lookupNativeTypeHelper(typeName)
|
||||
if not nativeType is None:
|
||||
if nativeType is not None:
|
||||
self.check(isinstance(nativeType, gdb.Type))
|
||||
return nativeType
|
||||
|
||||
def lookupNativeTypeHelper(self, typeName):
|
||||
typeobj = self.typeCache.get(typeName)
|
||||
#DumperBase.warn('LOOKUP 1: %s -> %s' % (typeName, typeobj))
|
||||
if not typeobj is None:
|
||||
if typeobj is not None:
|
||||
return typeobj
|
||||
|
||||
if typeName == 'void':
|
||||
@@ -1212,7 +1220,7 @@ class Dumper(DumperBase):
|
||||
ts = typeName
|
||||
ts = ts.replace('{anonymous}', '(anonymous namespace)')
|
||||
typeobj = self.lookupNativeType(ts)
|
||||
if not typeobj is None:
|
||||
if typeobj is not None:
|
||||
self.typeCache[typeName] = typeobj
|
||||
self.typesToReport[typeName] = typeobj
|
||||
return typeobj
|
||||
@@ -1248,7 +1256,7 @@ class Dumper(DumperBase):
|
||||
|
||||
if ts.endswith('*'):
|
||||
typeobj = self.lookupNativeType(ts[0:-1])
|
||||
if not typeobj is None:
|
||||
if typeobj is not None:
|
||||
typeobj = typeobj.pointer()
|
||||
self.typeCache[typeName] = typeobj
|
||||
self.typesToReport[typeName] = typeobj
|
||||
@@ -1271,7 +1279,7 @@ class Dumper(DumperBase):
|
||||
#DumperBase.warn("LOOKING UP '%s' FAILED" % ts)
|
||||
pass
|
||||
|
||||
if not typeobj is None:
|
||||
if typeobj is not None:
|
||||
#DumperBase.warn('CACHING: %s' % typeobj)
|
||||
self.typeCache[typeName] = typeobj
|
||||
self.typesToReport[typeName] = typeobj
|
||||
@@ -1292,7 +1300,7 @@ class Dumper(DumperBase):
|
||||
extraQml = int(args.get('extraqml', '0'))
|
||||
limit = int(args['limit'])
|
||||
if limit <= 0:
|
||||
limit = 10000
|
||||
limit = 10000
|
||||
|
||||
self.prepare(args)
|
||||
self.output = ''
|
||||
@@ -1316,8 +1324,8 @@ class Dumper(DumperBase):
|
||||
value = symbol.value(frame)
|
||||
typeobj = value.type
|
||||
if typeobj.code == gdb.TYPE_CODE_PTR:
|
||||
dereftype = typeobj.target().unqualified()
|
||||
if dereftype.name == needle:
|
||||
dereftype = typeobj.target().unqualified()
|
||||
if dereftype.name == needle:
|
||||
addr = toInteger(value)
|
||||
expr = pat % (ns, addr)
|
||||
res = str(gdb.parse_and_eval(expr))
|
||||
@@ -1347,7 +1355,7 @@ class Dumper(DumperBase):
|
||||
if sal:
|
||||
line = sal.line
|
||||
symtab = sal.symtab
|
||||
if not symtab is None:
|
||||
if symtab is not None:
|
||||
objfile = fromNativePath(symtab.objfile.filename)
|
||||
fullname = symtab.fullname()
|
||||
if fullname is None:
|
||||
@@ -1366,22 +1374,22 @@ class Dumper(DumperBase):
|
||||
context = interpreterFrame.get('context', 0)
|
||||
|
||||
self.put(('frame={function="%s",file="%s",'
|
||||
'line="%s",language="%s",context="%s"}')
|
||||
% (function, self.hexencode(fileName), lineNumber, language, context))
|
||||
'line="%s",language="%s",context="%s"}')
|
||||
% (function, self.hexencode(fileName), lineNumber, language, context))
|
||||
|
||||
if False and self.isInternalInterpreterFrame(functionName):
|
||||
frame = frame.older()
|
||||
self.put(('frame={address="0x%x",function="%s",'
|
||||
'file="%s",line="%s",'
|
||||
'module="%s",language="c",usable="0"}') %
|
||||
(pc, functionName, fileName, line, objfile))
|
||||
'file="%s",line="%s",'
|
||||
'module="%s",language="c",usable="0"}') %
|
||||
(pc, functionName, fileName, line, objfile))
|
||||
i += 1
|
||||
frame = frame.older()
|
||||
continue
|
||||
|
||||
self.put(('frame={level="%s",address="0x%x",function="%s",'
|
||||
'file="%s",line="%s",module="%s",language="c"}') %
|
||||
(i, pc, functionName, fileName, line, objfile))
|
||||
'file="%s",line="%s",module="%s",language="c"}') %
|
||||
(i, pc, functionName, fileName, line, objfile))
|
||||
|
||||
frame = frame.older()
|
||||
i += 1
|
||||
@@ -1406,7 +1414,7 @@ class Dumper(DumperBase):
|
||||
def exitGdb(self, _):
|
||||
gdb.execute('quit')
|
||||
|
||||
def reportResult(self, result, args = {}):
|
||||
def reportResult(self, result, args={}):
|
||||
print('result={token="%s",%s}' % (args.get("token", 0), result))
|
||||
|
||||
def profile1(self, args):
|
||||
@@ -1420,8 +1428,7 @@ class Dumper(DumperBase):
|
||||
def profile2(self, args):
|
||||
import timeit
|
||||
print(timeit.repeat('theDumper.fetchVariables(%s)' % args,
|
||||
'from __main__ import theDumper', number=10))
|
||||
|
||||
'from __main__ import theDumper', number=10))
|
||||
|
||||
|
||||
class CliDumper(Dumper):
|
||||
@@ -1473,6 +1480,7 @@ theCliDumper = CliDumper()
|
||||
def threadnames(arg):
|
||||
return theDumper.threadnames(int(arg))
|
||||
|
||||
|
||||
registerCommand('threadnames', threadnames)
|
||||
|
||||
#######################################################################
|
||||
@@ -1481,6 +1489,7 @@ registerCommand('threadnames', threadnames)
|
||||
#
|
||||
#######################################################################
|
||||
|
||||
|
||||
class InterpreterMessageBreakpoint(gdb.Breakpoint):
|
||||
def __init__(self):
|
||||
spec = 'qt_qmlDebugMessageAvailable'
|
||||
@@ -1501,6 +1510,7 @@ class InterpreterMessageBreakpoint(gdb.Breakpoint):
|
||||
def new_objfile_handler(event):
|
||||
return theDumper.handleNewObjectFile(event.new_objfile)
|
||||
|
||||
|
||||
gdb.events.new_objfile.connect(new_objfile_handler)
|
||||
|
||||
|
||||
|
||||
@@ -52,6 +52,7 @@ from dumper import DumperBase, SubItem, Children, TopLevelItem
|
||||
|
||||
qqWatchpointOffset = 10000
|
||||
|
||||
|
||||
def fileNameAsString(file):
|
||||
return str(file) if file.IsValid() else ''
|
||||
|
||||
@@ -60,8 +61,9 @@ def check(exp):
|
||||
if not exp:
|
||||
raise RuntimeError('Check failed')
|
||||
|
||||
|
||||
class Dumper(DumperBase):
|
||||
def __init__(self, debugger = None):
|
||||
def __init__(self, debugger=None):
|
||||
DumperBase.__init__(self)
|
||||
lldb.theDumper = self
|
||||
|
||||
@@ -169,14 +171,14 @@ class Dumper(DumperBase):
|
||||
elif code == lldb.eTypeClassTypedef:
|
||||
nativeTargetType = nativeType.GetUnqualifiedType()
|
||||
if hasattr(nativeTargetType, 'GetCanonicalType'):
|
||||
nativeTargetType = nativeTargetType.GetCanonicalType()
|
||||
nativeTargetType = nativeTargetType.GetCanonicalType()
|
||||
val = self.fromNativeValue(nativeValue.Cast(nativeTargetType))
|
||||
val.type = self.fromNativeType(nativeType)
|
||||
#DumperBase.warn('CREATED TYPEDEF: %s' % val)
|
||||
else:
|
||||
val = self.Value(self)
|
||||
address = nativeValue.GetLoadAddress()
|
||||
if not address is None:
|
||||
if address is not None:
|
||||
val.laddress = address
|
||||
if True:
|
||||
data = nativeValue.GetData()
|
||||
@@ -270,27 +272,27 @@ class Dumper(DumperBase):
|
||||
fieldBitpos = None
|
||||
isBitfield = False
|
||||
|
||||
if isBitfield: # Bit fields
|
||||
if isBitfield: # Bit fields
|
||||
fieldType = self.createBitfieldType(
|
||||
self.createType(self.typeName(nativeFieldType)), fieldBitsize)
|
||||
yield self.Field(self, name=fieldName, type=fieldType,
|
||||
bitsize=fieldBitsize, bitpos=fieldBitpos)
|
||||
|
||||
elif fieldName is None: # Anon members
|
||||
elif fieldName is None: # Anon members
|
||||
anonNumber += 1
|
||||
fieldName = '#%s' % anonNumber
|
||||
fakeMember = fakeValue.GetChildAtIndex(i)
|
||||
fakeMemberAddress = fakeMember.GetLoadAddress()
|
||||
offset = fakeMemberAddress - fakeAddress
|
||||
yield self.Field(self, name=fieldName, type=self.fromNativeType(nativeFieldType),
|
||||
bitsize=fieldBitsize, bitpos=8*offset)
|
||||
bitsize=fieldBitsize, bitpos=8 * offset)
|
||||
|
||||
elif fieldName in baseNames: # Simple bases
|
||||
member = self.fromNativeValue(fakeValue.GetChildAtIndex(i))
|
||||
member.isBaseClass = True
|
||||
yield member
|
||||
|
||||
else: # Normal named members
|
||||
else: # Normal named members
|
||||
member = self.fromNativeValue(fakeValue.GetChildAtIndex(i))
|
||||
member.name = nativeField.GetName()
|
||||
yield member
|
||||
@@ -389,7 +391,7 @@ class Dumper(DumperBase):
|
||||
#DumperBase.warn('TYPEDEF')
|
||||
nativeTargetType = nativeType.GetUnqualifiedType()
|
||||
if hasattr(nativeTargetType, 'GetCanonicalType'):
|
||||
nativeTargetType = nativeTargetType.GetCanonicalType()
|
||||
nativeTargetType = nativeTargetType.GetCanonicalType()
|
||||
targetType = self.fromNativeType(nativeTargetType)
|
||||
return self.createTypedefedType(targetType, nativeType.GetName())
|
||||
|
||||
@@ -398,10 +400,10 @@ class Dumper(DumperBase):
|
||||
|
||||
if code in (lldb.eTypeClassArray, lldb.eTypeClassVector):
|
||||
#DumperBase.warn('ARRAY: %s' % nativeType.GetName())
|
||||
if hasattr(nativeType, 'GetArrayElementType'): # New in 3.8(?) / 350.x
|
||||
if hasattr(nativeType, 'GetArrayElementType'): # New in 3.8(?) / 350.x
|
||||
nativeTargetType = nativeType.GetArrayElementType()
|
||||
if not nativeTargetType.IsValid():
|
||||
if hasattr(nativeType, 'GetVectorElementType'): # New in 3.8(?) / 350.x
|
||||
if hasattr(nativeType, 'GetVectorElementType'): # New in 3.8(?) / 350.x
|
||||
#DumperBase.warn('BAD: %s ' % nativeTargetType.get_fields_array())
|
||||
nativeTargetType = nativeType.GetVectorElementType()
|
||||
count = nativeType.GetByteSize() // nativeTargetType.GetByteSize()
|
||||
@@ -414,9 +416,9 @@ class Dumper(DumperBase):
|
||||
targetType = self.fromNativeType(nativeTargetType)
|
||||
tdata = targetType.typeData().copy()
|
||||
tdata.name = targetTypeName
|
||||
targetType.typeData = lambda : tdata
|
||||
targetType.typeData = lambda: tdata
|
||||
return self.createArrayType(targetType, count)
|
||||
if hasattr(nativeType, 'GetVectorElementType'): # New in 3.8(?) / 350.x
|
||||
if hasattr(nativeType, 'GetVectorElementType'): # New in 3.8(?) / 350.x
|
||||
nativeTargetType = nativeType.GetVectorElementType()
|
||||
count = nativeType.GetByteSize() // nativeTargetType.GetByteSize()
|
||||
targetType = self.fromNativeType(nativeTargetType)
|
||||
@@ -445,15 +447,15 @@ class Dumper(DumperBase):
|
||||
self.warn('UNKNOWN TYPE KEY: %s: %s' % (typeName, code))
|
||||
elif code == lldb.eTypeClassEnumeration:
|
||||
tdata.code = TypeCode.TypeCodeEnum
|
||||
tdata.enumDisplay = lambda intval, addr, form : \
|
||||
tdata.enumDisplay = lambda intval, addr, form: \
|
||||
self.nativeTypeEnumDisplay(nativeType, intval, form)
|
||||
elif code in (lldb.eTypeClassComplexInteger, lldb.eTypeClassComplexFloat):
|
||||
tdata.code = TypeCode.TypeCodeComplex
|
||||
elif code in (lldb.eTypeClassClass, lldb.eTypeClassStruct, lldb.eTypeClassUnion):
|
||||
tdata.code = TypeCode.TypeCodeStruct
|
||||
tdata.lalignment = lambda : \
|
||||
tdata.lalignment = lambda: \
|
||||
self.nativeStructAlignment(nativeType)
|
||||
tdata.lfields = lambda value : \
|
||||
tdata.lfields = lambda value: \
|
||||
self.listMembers(value, nativeType)
|
||||
tdata.templateArguments = self.listTemplateParametersHelper(nativeType)
|
||||
elif code == lldb.eTypeClassFunction:
|
||||
@@ -461,7 +463,7 @@ class Dumper(DumperBase):
|
||||
elif code == lldb.eTypeClassMemberPointer:
|
||||
tdata.code = TypeCode.TypeCodeMemberPointer
|
||||
|
||||
self.registerType(typeId, tdata) # Fix up fields and template args
|
||||
self.registerType(typeId, tdata) # Fix up fields and template args
|
||||
# warn('CREATE TYPE: %s' % typeId)
|
||||
#else:
|
||||
# warn('REUSE TYPE: %s' % typeId)
|
||||
@@ -489,7 +491,8 @@ class Dumper(DumperBase):
|
||||
# eTemplateArgumentKindExpression,
|
||||
# eTemplateArgumentKindPack
|
||||
if kind == lldb.eTemplateArgumentKindType:
|
||||
innerType = nativeType.GetTemplateArgumentType(i).GetUnqualifiedType().GetCanonicalType()
|
||||
innerType = nativeType.GetTemplateArgumentType(
|
||||
i).GetUnqualifiedType().GetCanonicalType()
|
||||
targs.append(self.fromNativeType(innerType))
|
||||
#elif kind == lldb.eTemplateArgumentKindIntegral:
|
||||
# innerType = nativeType.GetTemplateArgumentType(i).GetUnqualifiedType().GetCanonicalType()
|
||||
@@ -510,7 +513,7 @@ class Dumper(DumperBase):
|
||||
# targs.append(value)
|
||||
else:
|
||||
#DumperBase.warn('UNHANDLED TEMPLATE TYPE : %s' % kind)
|
||||
targs.append(stringArgs[i]) # Best we can do.
|
||||
targs.append(stringArgs[i]) # Best we can do.
|
||||
#DumperBase.warn('TARGS: %s %s' % (nativeType.GetName(), [str(x) for x in targs]))
|
||||
return targs
|
||||
|
||||
@@ -562,7 +565,7 @@ class Dumper(DumperBase):
|
||||
return form % intval
|
||||
|
||||
def nativeDynamicTypeName(self, address, baseType):
|
||||
return None # FIXME: Seems sufficient, no idea why.
|
||||
return None # FIXME: Seems sufficient, no idea why.
|
||||
addr = self.target.ResolveLoadAddress(address)
|
||||
ctx = self.target.ResolveSymbolContextForAddress(addr, 0)
|
||||
sym = ctx.GetSymbol()
|
||||
@@ -573,20 +576,20 @@ class Dumper(DumperBase):
|
||||
# See db.StateType
|
||||
return (
|
||||
'invalid',
|
||||
'unloaded', # Process is object is valid, but not currently loaded
|
||||
'connected', # Process is connected to remote debug services,
|
||||
# but not launched or attached to anything yet
|
||||
'attaching', # Process is currently trying to attach
|
||||
'launching', # Process is in the process of launching
|
||||
'stopped', # Process or thread is stopped and can be examined.
|
||||
'running', # Process or thread is running and can't be examined.
|
||||
'stepping', # Process or thread is in the process of stepping
|
||||
# and can not be examined.
|
||||
'crashed', # Process or thread has crashed and can be examined.
|
||||
'detached', # Process has been detached and can't be examined.
|
||||
'exited', # Process has exited and can't be examined.
|
||||
'suspended' # Process or thread is in a suspended state as far
|
||||
)[s]
|
||||
'unloaded', # Process is object is valid, but not currently loaded
|
||||
'connected', # Process is connected to remote debug services,
|
||||
# but not launched or attached to anything yet
|
||||
'attaching', # Process is currently trying to attach
|
||||
'launching', # Process is in the process of launching
|
||||
'stopped', # Process or thread is stopped and can be examined.
|
||||
'running', # Process or thread is running and can't be examined.
|
||||
'stepping', # Process or thread is in the process of stepping
|
||||
# and can not be examined.
|
||||
'crashed', # Process or thread has crashed and can be examined.
|
||||
'detached', # Process has been detached and can't be examined.
|
||||
'exited', # Process has exited and can't be examined.
|
||||
'suspended' # Process or thread is in a suspended state as far
|
||||
)[s]
|
||||
except:
|
||||
return 'unknown(%s)' % s
|
||||
|
||||
@@ -604,7 +607,7 @@ class Dumper(DumperBase):
|
||||
'plancomplete',
|
||||
'threadexiting',
|
||||
'instrumentation',
|
||||
)[s]
|
||||
)[s]
|
||||
except:
|
||||
return 'unknown(%s)' % s
|
||||
|
||||
@@ -708,8 +711,8 @@ class Dumper(DumperBase):
|
||||
if version.count('.') != 2:
|
||||
continue
|
||||
|
||||
version.replace("'", '"') # Both seem possible
|
||||
version = version[version.find('"')+1:version.rfind('"')]
|
||||
version.replace("'", '"') # Both seem possible
|
||||
version = version[version.find('"') + 1:version.rfind('"')]
|
||||
|
||||
(major, minor, patch) = version.split('.')
|
||||
qtVersion = 0x10000 * int(major) + 0x100 * int(minor) + int(patch)
|
||||
@@ -753,7 +756,7 @@ class Dumper(DumperBase):
|
||||
def lookupNativeType(self, name):
|
||||
#DumperBase.warn('LOOKUP TYPE NAME: %s' % name)
|
||||
typeobj = self.typeCache.get(name)
|
||||
if not typeobj is None:
|
||||
if typeobj is not None:
|
||||
#DumperBase.warn('CACHED: %s' % name)
|
||||
return typeobj
|
||||
typeobj = self.target.FindFirstType(name)
|
||||
@@ -845,7 +848,7 @@ class Dumper(DumperBase):
|
||||
self.startMode_ = args.get('startmode', 1)
|
||||
self.breakOnMain_ = args.get('breakonmain', 0)
|
||||
self.useTerminal_ = args.get('useterminal', 0)
|
||||
pargs = self.hexdecode(args.get('processargs', ''))
|
||||
pargs = self.hexdecode(args.get('processargs', ''))
|
||||
self.processArgs_ = pargs.split('\0') if len(pargs) else []
|
||||
self.environment_ = args.get('environment', [])
|
||||
self.environment_ = list(map(lambda x: self.hexdecode(x), self.environment_))
|
||||
@@ -858,7 +861,7 @@ class Dumper(DumperBase):
|
||||
if self.workingDirectory_ == '':
|
||||
try:
|
||||
self.workingDirectory_ = os.getcwd()
|
||||
except: # Could have been deleted in the mean time.
|
||||
except: # Could have been deleted in the mean time.
|
||||
pass
|
||||
|
||||
self.ignoreStops = 0
|
||||
@@ -884,7 +887,7 @@ class Dumper(DumperBase):
|
||||
|
||||
state = 1 if self.target.IsValid() else 0
|
||||
self.reportResult('success="%s",msg="%s",exe="%s"'
|
||||
% (state, error, self.executable_), args)
|
||||
% (state, error, self.executable_), args)
|
||||
|
||||
def runEngine(self, args):
|
||||
if self.runEngineAttempted:
|
||||
@@ -927,7 +930,7 @@ class Dumper(DumperBase):
|
||||
# better to mirror that and wait for the spontaneous stop.
|
||||
self.reportState('enginerunandinferiorrunok')
|
||||
elif self.startMode_ == DebuggerStartMode.AttachCore:
|
||||
coreFile = args.get('coreFile', '');
|
||||
coreFile = args.get('coreFile', '')
|
||||
self.process = self.target.LoadCore(coreFile)
|
||||
if self.process.IsValid():
|
||||
self.reportState('enginerunokandinferiorunrunnable')
|
||||
@@ -952,8 +955,8 @@ class Dumper(DumperBase):
|
||||
broadcaster.AddListener(listener, lldb.SBProcess.eBroadcastBitStateChanged)
|
||||
listener.StartListeningForEvents(broadcaster, lldb.SBProcess.eBroadcastBitStateChanged)
|
||||
broadcaster.AddListener(listener, lldb.SBTarget.eBroadcastBitBreakpointChanged)
|
||||
listener.StartListeningForEvents(broadcaster, lldb.SBTarget.eBroadcastBitBreakpointChanged)
|
||||
|
||||
listener.StartListeningForEvents(
|
||||
broadcaster, lldb.SBTarget.eBroadcastBitBreakpointChanged)
|
||||
|
||||
def loop(self):
|
||||
event = lldb.SBEvent()
|
||||
@@ -968,7 +971,6 @@ class Dumper(DumperBase):
|
||||
#if listener.WaitForEventForBroadcaster(0, broadcaster, event):
|
||||
# self.handleEvent(event)
|
||||
|
||||
|
||||
def describeError(self, error):
|
||||
desc = lldb.SBStream()
|
||||
error.GetDescription(desc)
|
||||
@@ -1092,8 +1094,8 @@ class Dumper(DumperBase):
|
||||
lineNumber = interpreterFrame.get('line', 0)
|
||||
context = interpreterFrame.get('context', 0)
|
||||
result += ('frame={function="%s",file="%s",'
|
||||
'line="%s",language="%s",context="%s"}'
|
||||
% (function, fileName, lineNumber, language, context))
|
||||
'line="%s",language="%s",context="%s"}'
|
||||
% (function, fileName, lineNumber, language, context))
|
||||
|
||||
fileName = fileNameAsString(lineEntry.file)
|
||||
result += '{pc="0x%x"' % pc
|
||||
@@ -1118,11 +1120,9 @@ class Dumper(DumperBase):
|
||||
# logview pane feature.
|
||||
self.report('token(\"%s\")' % args["token"])
|
||||
|
||||
|
||||
def reportBreakpointUpdate(self, bp):
|
||||
self.report('breakpointmodified={%s}' % self.describeBreakpoint(bp))
|
||||
|
||||
|
||||
def readRawMemory(self, address, size):
|
||||
if size == 0:
|
||||
return bytes()
|
||||
@@ -1203,7 +1203,7 @@ class Dumper(DumperBase):
|
||||
#else:
|
||||
if True:
|
||||
values = list(frame.GetVariables(True, True, False, True))
|
||||
values.reverse() # To get shadowed vars numbered backwards.
|
||||
values.reverse() # To get shadowed vars numbered backwards.
|
||||
|
||||
variables = []
|
||||
for val in values:
|
||||
@@ -1225,7 +1225,7 @@ class Dumper(DumperBase):
|
||||
self.put('],partial="%d"' % isPartial)
|
||||
self.reportResult(self.output, args)
|
||||
|
||||
def fetchRegisters(self, args = None):
|
||||
def fetchRegisters(self, args=None):
|
||||
if self.process is None:
|
||||
result = 'process="none"'
|
||||
else:
|
||||
@@ -1253,7 +1253,7 @@ class Dumper(DumperBase):
|
||||
self.reportResult('output="%s"' % result.GetOutput(), args)
|
||||
return
|
||||
# Try again with register write xmm0 "{0x00 ... 0x02}" syntax:
|
||||
vec = ' '.join(["0x" + value[i:i+2] for i in range(2, len(value), 2)])
|
||||
vec = ' '.join(["0x" + value[i:i + 2] for i in range(2, len(value), 2)])
|
||||
success = interp.HandleCommand('register write %s "{%s}"' % (name, vec), result)
|
||||
if success:
|
||||
self.reportResult('output="%s"' % result.GetOutput(), args)
|
||||
@@ -1295,7 +1295,6 @@ class Dumper(DumperBase):
|
||||
self.process.Kill()
|
||||
self.reportResult('', args)
|
||||
|
||||
|
||||
def handleBreakpointEvent(self, event):
|
||||
eventType = lldb.SBBreakpoint.GetBreakpointEventTypeFromEvent(event)
|
||||
# handle only the resolved locations for now..
|
||||
@@ -1304,7 +1303,6 @@ class Dumper(DumperBase):
|
||||
if bp is not None:
|
||||
self.reportBreakpointUpdate(bp)
|
||||
|
||||
|
||||
def handleEvent(self, event):
|
||||
if lldb.SBBreakpoint.EventIsBreakpointEvent(event):
|
||||
self.handleBreakpointEvent(event)
|
||||
@@ -1321,16 +1319,17 @@ class Dumper(DumperBase):
|
||||
flavor = event.GetDataFlavor()
|
||||
state = lldb.SBProcess.GetStateFromEvent(event)
|
||||
bp = lldb.SBBreakpoint.GetBreakpointFromEvent(event)
|
||||
skipEventReporting = eventType in (lldb.SBProcess.eBroadcastBitSTDOUT, lldb.SBProcess.eBroadcastBitSTDERR)
|
||||
skipEventReporting = eventType in (
|
||||
lldb.SBProcess.eBroadcastBitSTDOUT, lldb.SBProcess.eBroadcastBitSTDERR)
|
||||
self.report('event={type="%s",data="%s",msg="%s",flavor="%s",state="%s",bp="%s"}'
|
||||
% (eventType, out.GetData(), msg, flavor, self.stateName(state), bp))
|
||||
% (eventType, out.GetData(), msg, flavor, self.stateName(state), bp))
|
||||
|
||||
if state == lldb.eStateExited:
|
||||
self.eventState = state
|
||||
if not self.isShuttingDown_:
|
||||
self.reportState("inferiorexited")
|
||||
self.report('exited={status="%s",desc="%s"}'
|
||||
% (self.process.GetExitStatus(), self.process.GetExitDescription()))
|
||||
% (self.process.GetExitStatus(), self.process.GetExitDescription()))
|
||||
elif state != self.eventState and not skipEventReporting:
|
||||
self.eventState = state
|
||||
if state == lldb.eStateStopped:
|
||||
@@ -1347,7 +1346,7 @@ class Dumper(DumperBase):
|
||||
resolver()
|
||||
self.report("AUTO-CONTINUE AFTER RESOLVING")
|
||||
self.reportState("inferiorstopok")
|
||||
self.process.Continue();
|
||||
self.process.Continue()
|
||||
return
|
||||
if functionName == "::qt_qmlDebugMessageAvailable()":
|
||||
self.report("ASYNC MESSAGE FROM SERVICE")
|
||||
@@ -1355,7 +1354,7 @@ class Dumper(DumperBase):
|
||||
if not res:
|
||||
self.report("EVENT NEEDS NO STOP")
|
||||
self.reportState("stopped")
|
||||
self.process.Continue();
|
||||
self.process.Continue()
|
||||
return
|
||||
if self.isInterrupting_:
|
||||
self.isInterrupting_ = False
|
||||
@@ -1368,13 +1367,13 @@ class Dumper(DumperBase):
|
||||
else:
|
||||
self.reportState(self.stateName(state))
|
||||
|
||||
if eventType == lldb.SBProcess.eBroadcastBitStateChanged: # 1
|
||||
if eventType == lldb.SBProcess.eBroadcastBitStateChanged: # 1
|
||||
state = self.process.GetState()
|
||||
if state == lldb.eStateStopped:
|
||||
stoppedThread = self.firstStoppedThread()
|
||||
if stoppedThread:
|
||||
self.process.SetSelectedThread(stoppedThread)
|
||||
elif eventType == lldb.SBProcess.eBroadcastBitInterrupt: # 2
|
||||
elif eventType == lldb.SBProcess.eBroadcastBitInterrupt: # 2
|
||||
pass
|
||||
elif eventType == lldb.SBProcess.eBroadcastBitSTDOUT:
|
||||
# FIXME: Size?
|
||||
@@ -1391,9 +1390,9 @@ class Dumper(DumperBase):
|
||||
def describeBreakpoint(self, bp):
|
||||
isWatch = isinstance(bp, lldb.SBWatchpoint)
|
||||
if isWatch:
|
||||
result = 'lldbid="%s"' % (qqWatchpointOffset + bp.GetID())
|
||||
result = 'lldbid="%s"' % (qqWatchpointOffset + bp.GetID())
|
||||
else:
|
||||
result = 'lldbid="%s"' % bp.GetID()
|
||||
result = 'lldbid="%s"' % bp.GetID()
|
||||
result += ',valid="%s"' % (1 if bp.IsValid() else 0)
|
||||
result += ',hitcount="%s"' % bp.GetHitCount()
|
||||
if bp.IsValid():
|
||||
@@ -1469,7 +1468,7 @@ class Dumper(DumperBase):
|
||||
value = frame.FindVariable(args['expression'])
|
||||
error = lldb.SBError()
|
||||
bp = self.target.WatchAddress(value.GetLoadAddress(),
|
||||
value.GetByteSize(), False, True, error)
|
||||
value.GetByteSize(), False, True, error)
|
||||
except:
|
||||
bp = self.target.BreakpointCreateByName(None)
|
||||
else:
|
||||
@@ -1528,7 +1527,7 @@ class Dumper(DumperBase):
|
||||
enabled = loc.IsEnabled()
|
||||
res = True
|
||||
self.reportResult('success="%s",enabled="%s",locid="%s"'
|
||||
% (int(res), int(enabled), locId), args)
|
||||
% (int(res), int(enabled), locId), args)
|
||||
|
||||
def removeBreakpoint(self, args):
|
||||
lldbId = int(args['lldbid'])
|
||||
@@ -1608,7 +1607,7 @@ class Dumper(DumperBase):
|
||||
self.currentThread().StepInstruction(False)
|
||||
self.reportResult('', args)
|
||||
|
||||
def executeStepOut(self, args = {}):
|
||||
def executeStepOut(self, args={}):
|
||||
self.currentThread().StepOut()
|
||||
self.reportResult('', args)
|
||||
|
||||
@@ -1622,7 +1621,7 @@ class Dumper(DumperBase):
|
||||
if bp.GetNumLocations() == 0:
|
||||
self.target.BreakpointDelete(bp.GetID())
|
||||
self.reportResult(self.describeStatus('No target location found.')
|
||||
+ self.describeLocation(frame), args)
|
||||
+ self.describeLocation(frame), args)
|
||||
return
|
||||
bp.SetOneShot(True)
|
||||
self.reportResult('', args)
|
||||
@@ -1647,7 +1646,7 @@ class Dumper(DumperBase):
|
||||
bp = self.target.BreakpointCreateByAddress(addr)
|
||||
else:
|
||||
bp = self.target.BreakpointCreateByLocation(
|
||||
str(args['file']), int(args['line']))
|
||||
str(args['file']), int(args['line']))
|
||||
if bp.GetNumLocations() == 0:
|
||||
self.target.BreakpointDelete(bp.GetID())
|
||||
status = 'No target location found.'
|
||||
@@ -1663,7 +1662,7 @@ class Dumper(DumperBase):
|
||||
result = lldb.SBCommandReturnObject()
|
||||
self.debugger.GetCommandInterpreter().HandleCommand('break list', result)
|
||||
self.report('success="%d",output="%s",error="%s"'
|
||||
% (result.Succeeded(), result.GetOutput(), result.GetError()))
|
||||
% (result.Succeeded(), result.GetOutput(), result.GetError()))
|
||||
|
||||
def activateFrame(self, args):
|
||||
self.reportToken(args)
|
||||
@@ -1675,7 +1674,7 @@ class Dumper(DumperBase):
|
||||
self.process.SetSelectedThreadByID(int(args['id']))
|
||||
self.reportResult('', args)
|
||||
|
||||
def fetchFullBacktrace(self, _ = None):
|
||||
def fetchFullBacktrace(self, _=None):
|
||||
command = 'thread backtrace all'
|
||||
result = lldb.SBCommandReturnObject()
|
||||
self.debugger.GetCommandInterpreter().HandleCommand(command, result)
|
||||
@@ -1748,7 +1747,7 @@ class Dumper(DumperBase):
|
||||
result += ',hunk="%s"}' % hunk
|
||||
result += '{address="%s"' % loadAddr
|
||||
result += ',data="%s %s"' % (insn.GetMnemonic(self.target),
|
||||
insn.GetOperands(self.target))
|
||||
insn.GetOperands(self.target))
|
||||
result += ',function="%s"' % functionName
|
||||
rawData = insn.GetData(self.target).uint8s
|
||||
result += ',rawdata="%s"' % ' '.join(["%02x" % x for x in rawData])
|
||||
@@ -1854,7 +1853,7 @@ class Tester(Dumper):
|
||||
error = lldb.SBError()
|
||||
launchInfo = lldb.SBLaunchInfo([])
|
||||
launchInfo.SetWorkingDirectory(os.getcwd())
|
||||
environmentList = [key + '=' + value for key,value in os.environ.items()]
|
||||
environmentList = [key + '=' + value for key, value in os.environ.items()]
|
||||
launchInfo.SetEnvironmentEntries(environmentList, False)
|
||||
|
||||
self.process = self.target.Launch(launchInfo, error)
|
||||
@@ -1868,9 +1867,9 @@ class Tester(Dumper):
|
||||
if listener.WaitForEvent(100, event):
|
||||
#DumperBase.warn('EVENT: %s' % event)
|
||||
state = lldb.SBProcess.GetStateFromEvent(event)
|
||||
if state == lldb.eStateExited: # 10
|
||||
if state == lldb.eStateExited: # 10
|
||||
break
|
||||
if state == lldb.eStateStopped: # 5
|
||||
if state == lldb.eStateStopped: # 5
|
||||
stoppedThread = None
|
||||
for i in range(0, self.process.GetNumThreads()):
|
||||
thread = self.process.GetThreadAtIndex(i)
|
||||
@@ -1904,14 +1903,16 @@ class Tester(Dumper):
|
||||
|
||||
# ------------------------------ For use in LLDB ------------------------------
|
||||
|
||||
|
||||
from pprint import pprint
|
||||
|
||||
__module__ = sys.modules[__name__]
|
||||
DEBUG = False if not hasattr(__module__, 'DEBUG') else DEBUG
|
||||
|
||||
class LogMixin:
|
||||
|
||||
class LogMixin():
|
||||
@staticmethod
|
||||
def log(message = '', log_caller = False, frame = 1, args = ''):
|
||||
def log(message='', log_caller=False, frame=1, args=''):
|
||||
if not DEBUG:
|
||||
return
|
||||
if log_caller:
|
||||
@@ -1925,13 +1926,15 @@ class LogMixin:
|
||||
print(message)
|
||||
|
||||
@staticmethod
|
||||
def log_fn(arg_str = ''):
|
||||
LogMixin.log(log_caller = True, frame = 2, args = arg_str)
|
||||
def log_fn(arg_str=''):
|
||||
LogMixin.log(log_caller=True, frame=2, args=arg_str)
|
||||
|
||||
|
||||
class DummyDebugger(object):
|
||||
def __getattr__(self, attr):
|
||||
raise AttributeError("Debugger should not be needed to create summaries")
|
||||
|
||||
|
||||
class SummaryDumper(Dumper, LogMixin):
|
||||
_instance = None
|
||||
_lock = threading.RLock()
|
||||
@@ -1971,9 +1974,9 @@ class SummaryDumper(Dumper, LogMixin):
|
||||
Dumper.__init__(self, DummyDebugger())
|
||||
|
||||
self.setVariableFetchingOptions({
|
||||
'fancy' : True,
|
||||
'qobjectnames' : True,
|
||||
'passexceptions' : True
|
||||
'fancy': True,
|
||||
'qobjectnames': True,
|
||||
'passexceptions': True
|
||||
})
|
||||
|
||||
self.dumpermodules = ['qttypes']
|
||||
@@ -1981,19 +1984,19 @@ class SummaryDumper(Dumper, LogMixin):
|
||||
self.output = ''
|
||||
|
||||
def report(self, stuff):
|
||||
return # Don't mess up lldb output
|
||||
return # Don't mess up lldb output
|
||||
|
||||
def lookupNativeTypeInAllModules(self, name):
|
||||
self.warn('Failed to resolve type %s' % name)
|
||||
return None
|
||||
|
||||
def dump_summary(self, valobj, expanded = False):
|
||||
def dump_summary(self, valobj, expanded=False):
|
||||
try:
|
||||
from pygdbmi import gdbmiparser
|
||||
except ImportError:
|
||||
print("Qt summary provider requires the pygdbmi module, "
|
||||
"please install using 'sudo /usr/bin/easy_install pygdbmi', "
|
||||
"and then restart Xcode.")
|
||||
"please install using 'sudo /usr/bin/easy_install pygdbmi', "
|
||||
"and then restart Xcode.")
|
||||
lldb.debugger.HandleCommand('type category delete Qt')
|
||||
return None
|
||||
|
||||
@@ -2021,14 +2024,15 @@ class SummaryDumper(Dumper, LogMixin):
|
||||
|
||||
return summary
|
||||
|
||||
|
||||
class SummaryProvider(LogMixin):
|
||||
|
||||
DEFAULT_SUMMARY = ''
|
||||
VOID_PTR_TYPE = None
|
||||
|
||||
@staticmethod
|
||||
def provide_summary(valobj, internal_dict, options = None):
|
||||
if not __name__ in internal_dict:
|
||||
def provide_summary(valobj, internal_dict, options=None):
|
||||
if __name__ not in internal_dict:
|
||||
# When disabling the import of the Qt summary providers, the
|
||||
# summary functions are still registered with LLDB, and we will
|
||||
# get callbacks to provide summaries, but at this point the child
|
||||
@@ -2048,7 +2052,7 @@ class SummaryProvider(LogMixin):
|
||||
|
||||
return provider.get_summary(options)
|
||||
|
||||
def __init__(self, valobj, expand = False):
|
||||
def __init__(self, valobj, expand=False):
|
||||
# Prevent recursive evaluation during logging, etc
|
||||
valobj.SetPreferSyntheticValue(False)
|
||||
|
||||
@@ -2088,29 +2092,29 @@ class SummaryProvider(LogMixin):
|
||||
|
||||
if encoding:
|
||||
special_encodings = {
|
||||
"empty" : "<empty>",
|
||||
"minimumitemcount" : "<at least %s items>" % summaryValue,
|
||||
"undefined" : "<undefined>",
|
||||
"null" : "<null>",
|
||||
"itemcount" : "<%s items>" % summaryValue,
|
||||
"notaccessible" : "<not accessible>",
|
||||
"optimizedout" : "<optimized out>",
|
||||
"nullreference" : "<null reference>",
|
||||
"emptystructure" : "<empty structure>",
|
||||
"uninitialized" : "<uninitialized>",
|
||||
"invalid" : "<invalid>",
|
||||
"notcallable" : "<not callable>",
|
||||
"outofscope" : "<out of scope>"
|
||||
"empty": "<empty>",
|
||||
"minimumitemcount": "<at least %s items>" % summaryValue,
|
||||
"undefined": "<undefined>",
|
||||
"null": "<null>",
|
||||
"itemcount": "<%s items>" % summaryValue,
|
||||
"notaccessible": "<not accessible>",
|
||||
"optimizedout": "<optimized out>",
|
||||
"nullreference": "<null reference>",
|
||||
"emptystructure": "<empty structure>",
|
||||
"uninitialized": "<uninitialized>",
|
||||
"invalid": "<invalid>",
|
||||
"notcallable": "<not callable>",
|
||||
"outofscope": "<out of scope>"
|
||||
}
|
||||
if encoding in special_encodings:
|
||||
return special_encodings[encoding]
|
||||
|
||||
text_encodings = [
|
||||
'latin1',
|
||||
# 'local8bit',
|
||||
# 'local8bit',
|
||||
'utf8',
|
||||
'utf16',
|
||||
# 'ucs4'
|
||||
# 'ucs4'
|
||||
]
|
||||
|
||||
if encoding in text_encodings:
|
||||
@@ -2122,8 +2126,15 @@ class SummaryProvider(LogMixin):
|
||||
return "<failed to decode '%s' as '%s'>" % (summaryValue, encoding)
|
||||
|
||||
# FIXME: Support these
|
||||
other_encodings = ['int', 'uint', 'float', 'juliandate', 'juliandateandmillisecondssincemidnight',
|
||||
'millisecondssincemidnight', 'ipv6addressandhexscopeid', 'datetimeinternal']
|
||||
other_encodings = [
|
||||
'int',
|
||||
'uint',
|
||||
'float',
|
||||
'juliandate',
|
||||
'juliandateandmillisecondssincemidnight',
|
||||
'millisecondssincemidnight',
|
||||
'ipv6addressandhexscopeid',
|
||||
'datetimeinternal']
|
||||
|
||||
summaryValue += " <encoding='%s'>" % encoding
|
||||
|
||||
@@ -2136,9 +2147,10 @@ class SummaryProvider(LogMixin):
|
||||
|
||||
return summaryValue.strip()
|
||||
|
||||
|
||||
class SyntheticChildrenProvider(SummaryProvider):
|
||||
def __init__(self, valobj, dict):
|
||||
SummaryProvider.__init__(self, valobj, expand = True)
|
||||
SummaryProvider.__init__(self, valobj, expand=True)
|
||||
self.summary = None
|
||||
self.synthetic_children = []
|
||||
|
||||
@@ -2147,7 +2159,7 @@ class SyntheticChildrenProvider(SummaryProvider):
|
||||
|
||||
def num_children(self):
|
||||
self.log("native: %d synthetic: %d" %
|
||||
(self.num_native_children(), len(self.synthetic_children)), True)
|
||||
(self.num_native_children(), len(self.synthetic_children)), True)
|
||||
return self._num_children()
|
||||
|
||||
def _num_children(self):
|
||||
@@ -2181,7 +2193,7 @@ class SyntheticChildrenProvider(SummaryProvider):
|
||||
|
||||
return value
|
||||
|
||||
def create_value(self, child, name = ''):
|
||||
def create_value(self, child, name=''):
|
||||
child_type = child.get('type', self.summary.get('childtype'))
|
||||
|
||||
value = None
|
||||
@@ -2196,8 +2208,8 @@ class SyntheticChildrenProvider(SummaryProvider):
|
||||
|
||||
# Create as void* so that the value is fully initialized before
|
||||
# we trigger our own summary/child providers recursively.
|
||||
value = self.valobj.synthetic_child_from_address(name, address,
|
||||
SummaryProvider.VOID_PTR_TYPE).Cast(value_type)
|
||||
value = self.valobj.synthetic_child_from_address(
|
||||
name, address, SummaryProvider.VOID_PTR_TYPE).Cast(value_type)
|
||||
else:
|
||||
self.log("Don't know how to create value for child %s" % child)
|
||||
# FIXME: Figure out if we ever will hit this case, and deal with it
|
||||
@@ -2219,7 +2231,7 @@ class SyntheticChildrenProvider(SummaryProvider):
|
||||
|
||||
dereference_child = None
|
||||
for child in self.summary['children']:
|
||||
if not child or not type(child) is dict:
|
||||
if not child or not isinstance(child, dict):
|
||||
continue
|
||||
|
||||
# Skip base classes, they are built-in children
|
||||
@@ -2254,8 +2266,9 @@ class SyntheticChildrenProvider(SummaryProvider):
|
||||
# the debugger UI, even if dereferencing the pointer works fine.
|
||||
# We fall back to the special child reported by the Qt dumper.
|
||||
if not self.valobj.GetNumChildren() and dereference_child:
|
||||
self.valobj = self.create_value(dereference_child)
|
||||
self.update()
|
||||
self.valobj = self.create_value(dereference_child)
|
||||
self.update()
|
||||
|
||||
|
||||
def __lldb_init_module(debugger, internal_dict):
|
||||
# Module is being imported in an LLDB session
|
||||
@@ -2266,25 +2279,25 @@ def __lldb_init_module(debugger, internal_dict):
|
||||
# Concrete types
|
||||
summary_function = "%s.%s.%s" % (__name__, 'SummaryProvider', 'provide_summary')
|
||||
types = map(lambda x: x.replace('__', '::'), dumper.qqDumpers)
|
||||
debugger.HandleCommand("type summary add -F %s -w %s %s" \
|
||||
% (summary_function, type_category, ' '.join(types)))
|
||||
debugger.HandleCommand("type summary add -F %s -w %s %s"
|
||||
% (summary_function, type_category, ' '.join(types)))
|
||||
|
||||
regex_types = list(map(lambda x: "'" + x + "'", dumper.qqDumpersEx.keys()))
|
||||
if regex_types:
|
||||
debugger.HandleCommand("type summary add -x -F %s -w %s %s" \
|
||||
% (summary_function, type_category, ' '.join(regex_types)))
|
||||
debugger.HandleCommand("type summary add -x -F %s -w %s %s"
|
||||
% (summary_function, type_category, ' '.join(regex_types)))
|
||||
|
||||
# Global catch-all for Qt classes
|
||||
debugger.HandleCommand("type summary add -x '^Q.*$' -F %s -w %s" \
|
||||
% (summary_function, type_category))
|
||||
debugger.HandleCommand("type summary add -x '^Q.*$' -F %s -w %s"
|
||||
% (summary_function, type_category))
|
||||
|
||||
# Named summary ('frame variable foo --summary Qt')
|
||||
debugger.HandleCommand("type summary add --name Qt -F %s -w %s" \
|
||||
% (summary_function, type_category))
|
||||
debugger.HandleCommand("type summary add --name Qt -F %s -w %s"
|
||||
% (summary_function, type_category))
|
||||
|
||||
# Synthetic children
|
||||
debugger.HandleCommand("type synthetic add -x '^Q.*$' -l %s -w %s" \
|
||||
% ("lldbbridge.SyntheticChildrenProvider", type_category))
|
||||
debugger.HandleCommand("type synthetic add -x '^Q.*$' -l %s -w %s"
|
||||
% ("lldbbridge.SyntheticChildrenProvider", type_category))
|
||||
|
||||
debugger.HandleCommand('type category enable %s' % type_category)
|
||||
|
||||
|
||||
@@ -33,39 +33,46 @@ import re
|
||||
#
|
||||
#######################################################################
|
||||
|
||||
|
||||
def qdump____m128(d, value):
|
||||
d.putEmptyValue()
|
||||
if d.isExpanded():
|
||||
d.putArrayData(value.address(), 4, d.lookupType('float'))
|
||||
|
||||
|
||||
def qdump____m256(d, value):
|
||||
d.putEmptyValue()
|
||||
if d.isExpanded():
|
||||
d.putArrayData(value.address(), 8, d.lookupType('float'))
|
||||
|
||||
|
||||
def qdump____m512(d, value):
|
||||
d.putEmptyValue()
|
||||
if d.isExpanded():
|
||||
d.putArrayData(value.address(), 16, d.lookupType('float'))
|
||||
|
||||
|
||||
def qdump____m128d(d, value):
|
||||
d.putEmptyValue()
|
||||
if d.isExpanded():
|
||||
d.putArrayData(value.address(), 2, d.lookupType('double'))
|
||||
|
||||
|
||||
def qdump____m256d(d, value):
|
||||
d.putEmptyValue()
|
||||
if d.isExpanded():
|
||||
d.putArrayData(value.address(), 4, d.lookupType('double'))
|
||||
|
||||
|
||||
def qdump____m512d(d, value):
|
||||
d.putEmptyValue()
|
||||
if d.isExpanded():
|
||||
d.putArrayData(value.address(), 8, d.lookupType('double'))
|
||||
|
||||
|
||||
def qdump____m128i(d, value):
|
||||
data = d.hexencode(value.data(16))
|
||||
d.putValue(':'.join('%04x' % int(data[i:i+4], 16) for i in range(0, 32, 4)))
|
||||
d.putValue(':'.join('%04x' % int(data[i:i + 4], 16) for i in range(0, 32, 4)))
|
||||
if d.isExpanded():
|
||||
with Children(d):
|
||||
addr = value.address()
|
||||
@@ -74,9 +81,10 @@ def qdump____m128i(d, value):
|
||||
d.putArrayItem('uint32x4', addr, 4, 'unsigned int')
|
||||
d.putArrayItem('uint64x2', addr, 2, 'unsigned long long')
|
||||
|
||||
|
||||
def qdump____m256i(d, value):
|
||||
data = d.hexencode(value.data(32))
|
||||
d.putValue(':'.join('%04x' % int(data[i:i+4], 16) for i in range(0, 64, 4)))
|
||||
d.putValue(':'.join('%04x' % int(data[i:i + 4], 16) for i in range(0, 64, 4)))
|
||||
if d.isExpanded():
|
||||
with Children(d):
|
||||
addr = value.address()
|
||||
@@ -85,10 +93,11 @@ def qdump____m256i(d, value):
|
||||
d.putArrayItem('uint32x8', addr, 8, 'unsigned int')
|
||||
d.putArrayItem('uint64x4', addr, 4, 'unsigned long long')
|
||||
|
||||
|
||||
def qdump____m512i(d, value):
|
||||
data = d.hexencode(value.data(64))
|
||||
d.putValue(':'.join('%04x' % int(data[i:i+4], 16) for i in range(0, 64, 4))
|
||||
+ ', ' + ':'.join('%04x' % int(data[i:i+4], 16) for i in range(64, 128, 4)))
|
||||
d.putValue(':'.join('%04x' % int(data[i:i + 4], 16) for i in range(0, 64, 4))
|
||||
+ ', ' + ':'.join('%04x' % int(data[i:i + 4], 16) for i in range(64, 128, 4)))
|
||||
if d.isExpanded():
|
||||
with Children(d):
|
||||
d.putArrayItem('uint32x16', value.address(), 16, 'unsigned int')
|
||||
@@ -100,15 +109,18 @@ def qdump____m512i(d, value):
|
||||
#
|
||||
#######################################################################
|
||||
|
||||
|
||||
def qform__std__array():
|
||||
return [DisplayFormat.ArrayPlotFormat]
|
||||
|
||||
|
||||
def qdump__gsl__span(d, value):
|
||||
size, pointer = value.split('pp')
|
||||
d.putItemCount(size)
|
||||
if d.isExpanded():
|
||||
d.putPlotData(pointer, size, value.type[0])
|
||||
|
||||
|
||||
def qdump__gsl__byte(d, value):
|
||||
d.putNumChild(0)
|
||||
d.putValue(value.integer())
|
||||
@@ -122,6 +134,7 @@ def qdump__gsl__byte(d, value):
|
||||
#def qform__Eigen__Matrix():
|
||||
# return 'Transposed'
|
||||
|
||||
|
||||
def qdump__Eigen__Matrix(d, value):
|
||||
innerType = value.type[0]
|
||||
argRow = value.type[1]
|
||||
@@ -185,7 +198,8 @@ def qdump__NimStringDesc(d, value):
|
||||
d.putBetterType('string')
|
||||
d.putCharArrayHelper(data, size, d.createType('char'), 'utf8')
|
||||
|
||||
def qdump__NimGenericSequence__(d, value, regex = '^TY[\d]+$'):
|
||||
|
||||
def qdump__NimGenericSequence__(d, value, regex=r'^TY[\d]+$'):
|
||||
code = value.type.stripTypedefs().code
|
||||
if code == TypeCode.TypeCodeStruct:
|
||||
size, reserved = d.split('pp', value)
|
||||
@@ -198,6 +212,7 @@ def qdump__NimGenericSequence__(d, value, regex = '^TY[\d]+$'):
|
||||
d.putEmptyValue()
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__TNimNode(d, value):
|
||||
name = value['name'].pointer()
|
||||
d.putSimpleCharArray(name) if name != 0 else d.putEmptyValue()
|
||||
@@ -222,6 +237,7 @@ def qdump__TNimNode(d, value):
|
||||
def cleanDType(type):
|
||||
return str(type).replace('uns long long', 'string')
|
||||
|
||||
|
||||
def qdump_Array(d, value):
|
||||
n = value['length']
|
||||
p = value['ptr']
|
||||
@@ -251,7 +267,7 @@ def qdump_AArray(d, value):
|
||||
d.putEmptyValue()
|
||||
if d.isExpanded():
|
||||
with Children(d, 1):
|
||||
d.putSubItem('ptr', p)
|
||||
d.putSubItem('ptr', p)
|
||||
|
||||
|
||||
#######################################################################
|
||||
@@ -264,7 +280,7 @@ if False:
|
||||
|
||||
def qdump__tree_entry(d, value):
|
||||
d.putValue('len: %s, offset: %s, type: %s' %
|
||||
(value['blocklength'], value['offset'], value['type']))
|
||||
(value['blocklength'], value['offset'], value['type']))
|
||||
d.putNumChild(0)
|
||||
|
||||
def qdump__tree(d, value):
|
||||
@@ -273,42 +289,42 @@ if False:
|
||||
base = value['base'].pointer()
|
||||
d.putItemCount(count)
|
||||
if d.isExpanded():
|
||||
with Children(d):
|
||||
with SubItem(d, 'tree'):
|
||||
d.putEmptyValue()
|
||||
d.putNoType()
|
||||
if d.isExpanded():
|
||||
with Children(d):
|
||||
for i in range(count):
|
||||
d.putSubItem(Item(entries[i], iname))
|
||||
with SubItem(d, 'data'):
|
||||
d.putEmptyValue()
|
||||
d.putNoType()
|
||||
if d.isExpanded():
|
||||
with Children(d):
|
||||
for i in range(count):
|
||||
with SubItem(d, i):
|
||||
entry = entries[i]
|
||||
mpitype = str(entry['type'])
|
||||
d.putType(mpitype)
|
||||
length = int(entry['blocklength'])
|
||||
offset = int(entry['offset'])
|
||||
d.putValue('%s items at %s' % (length, offset))
|
||||
if mpitype == 'MPI_INT':
|
||||
innerType = 'int'
|
||||
elif mpitype == 'MPI_CHAR':
|
||||
innerType = 'char'
|
||||
elif mpitype == 'MPI_DOUBLE':
|
||||
innerType = 'double'
|
||||
else:
|
||||
length = 0
|
||||
d.putNumChild(length)
|
||||
if d.isExpanded():
|
||||
with Children(d):
|
||||
t = d.lookupType(innerType).pointer()
|
||||
p = (base + offset).cast(t)
|
||||
for j in range(length):
|
||||
d.putSubItem(j, p.dereference())
|
||||
with Children(d):
|
||||
with SubItem(d, 'tree'):
|
||||
d.putEmptyValue()
|
||||
d.putNoType()
|
||||
if d.isExpanded():
|
||||
with Children(d):
|
||||
for i in range(count):
|
||||
d.putSubItem(Item(entries[i], iname))
|
||||
with SubItem(d, 'data'):
|
||||
d.putEmptyValue()
|
||||
d.putNoType()
|
||||
if d.isExpanded():
|
||||
with Children(d):
|
||||
for i in range(count):
|
||||
with SubItem(d, i):
|
||||
entry = entries[i]
|
||||
mpitype = str(entry['type'])
|
||||
d.putType(mpitype)
|
||||
length = int(entry['blocklength'])
|
||||
offset = int(entry['offset'])
|
||||
d.putValue('%s items at %s' % (length, offset))
|
||||
if mpitype == 'MPI_INT':
|
||||
innerType = 'int'
|
||||
elif mpitype == 'MPI_CHAR':
|
||||
innerType = 'char'
|
||||
elif mpitype == 'MPI_DOUBLE':
|
||||
innerType = 'double'
|
||||
else:
|
||||
length = 0
|
||||
d.putNumChild(length)
|
||||
if d.isExpanded():
|
||||
with Children(d):
|
||||
t = d.lookupType(innerType).pointer()
|
||||
p = (base + offset).cast(t)
|
||||
for j in range(length):
|
||||
d.putSubItem(j, p.dereference())
|
||||
|
||||
|
||||
#######################################################################
|
||||
@@ -322,6 +338,7 @@ def qdump__KDSoapValue1(d, value):
|
||||
d.putStringValue(inner['m_name'])
|
||||
d.putPlainChildren(inner)
|
||||
|
||||
|
||||
def qdump__KDSoapValue(d, value):
|
||||
p = (value.cast(d.lookupType('char*')) + 4).dereference().cast(d.lookupType('QString'))
|
||||
d.putStringValue(p)
|
||||
@@ -528,6 +545,7 @@ def qdump__PyVarObject(d, value):
|
||||
def qdump__QtcDumperTest_FieldAccessByIndex(d, value):
|
||||
d.putValue(value["d"][2].integer())
|
||||
|
||||
|
||||
def qdump__QtcDumperTest_PointerArray(d, value):
|
||||
foos = value["foos"]
|
||||
d.putItemCount(10)
|
||||
@@ -536,6 +554,7 @@ def qdump__QtcDumperTest_PointerArray(d, value):
|
||||
for i in d.childRange():
|
||||
d.putSubItem(i, foos[i])
|
||||
|
||||
|
||||
def qdump__QtcDumperTest_BufArray(d, value):
|
||||
maxItems = 1000
|
||||
buffer = value['buffer']
|
||||
@@ -549,11 +568,12 @@ def qdump__QtcDumperTest_BufArray(d, value):
|
||||
for i in d.childRange():
|
||||
d.putSubItem(i, (buffer + (i * objsize)).dereference().cast(valueType))
|
||||
|
||||
|
||||
def qdump__QtcDumperTest_List__NodeX(d, value):
|
||||
typename = value.type.unqualified().name
|
||||
pos0 = typename.find('<')
|
||||
pos1 = typename.find('>')
|
||||
tName = typename[pos0+1:pos1]
|
||||
tName = typename[pos0 + 1:pos1]
|
||||
d.putBetterType('QtcDumperTest_List<' + tName + '>::Node')
|
||||
d.putNumChild(1)
|
||||
if d.isExpanded():
|
||||
@@ -563,6 +583,7 @@ def qdump__QtcDumperTest_List__NodeX(d, value):
|
||||
d.putFields(value)
|
||||
#d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__QtcDumperTest_List(d, value):
|
||||
innerType = value.type[0]
|
||||
d.putNumChild(1)
|
||||
@@ -574,6 +595,7 @@ def qdump__QtcDumperTest_List(d, value):
|
||||
d.putFields(value)
|
||||
#d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qdump__QtcDumperTest_String(d, value):
|
||||
with Children(d):
|
||||
first = d.hexdecode(d.putSubItem('first', value['first']).value)
|
||||
|
||||
@@ -26,16 +26,19 @@
|
||||
from dumper import Children, SubItem
|
||||
from utils import TypeCode, DisplayFormat
|
||||
|
||||
|
||||
def qdump__cv__Size_(d, value):
|
||||
d.putValue('(%s, %s)' % (value[0].display(), value[1].display()))
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qform__cv__Mat():
|
||||
return [DisplayFormat.SeparateFormat]
|
||||
|
||||
|
||||
def qdump__cv__Mat(d, value):
|
||||
(flag, dims, rows, cols, data, refcount, datastart, dataend,
|
||||
datalimit, allocator, size, stepp) \
|
||||
datalimit, allocator, size, stepp) \
|
||||
= value.split('iiiipppppppp')
|
||||
steps = d.split('p' * dims, stepp)
|
||||
innerSize = 0 if dims == 0 else steps[dims - 1]
|
||||
|
||||
@@ -41,7 +41,7 @@ class QuitException(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class QtcInternalBreakpoint:
|
||||
class QtcInternalBreakpoint():
|
||||
"""Breakpoint class.
|
||||
Breakpoints are indexed by number through bpbynumber and by
|
||||
the file,line tuple using bplist. The former points to a
|
||||
@@ -52,9 +52,9 @@ class QtcInternalBreakpoint:
|
||||
|
||||
next = 1 # Next bp to be assigned
|
||||
bplist = {} # indexed by (file, lineno) tuple
|
||||
bpbynumber = [None] # Each entry is None or an instance of Bpt
|
||||
# index 0 is unused, except for marking an
|
||||
# effective break .... see effective()
|
||||
bpbynumber = [None] # Each entry is None or an instance of Bpt
|
||||
# index 0 is unused, except for marking an
|
||||
# effective break .... see effective()
|
||||
|
||||
def __init__(self, filepath, line, temporary=False, cond=None, funcname=None):
|
||||
self.funcname = funcname
|
||||
@@ -115,7 +115,7 @@ def checkfuncname(b, frame):
|
||||
# The function is entered for the 1st time.
|
||||
b.func_first_executable_line = frame.f_lineno
|
||||
|
||||
if b.func_first_executable_line != frame.f_lineno:
|
||||
if b.func_first_executable_line != frame.f_lineno:
|
||||
# But we are not at the first line number: don't break.
|
||||
return False
|
||||
return True
|
||||
@@ -193,7 +193,7 @@ class _rstr(str):
|
||||
return self
|
||||
|
||||
|
||||
class QtcInternalDumper:
|
||||
class QtcInternalDumper():
|
||||
identchars = string.ascii_letters + string.digits + '_'
|
||||
lastcmd = ''
|
||||
use_rawinput = 1
|
||||
@@ -387,7 +387,7 @@ class QtcInternalDumper:
|
||||
# (CT) stopframe may now also be None, see dispatch_call.
|
||||
# (CT) the former test for None is therefore removed from here.
|
||||
if self.skip and \
|
||||
self.is_skipped_module(frame.f_globals.get('__name__')):
|
||||
self.is_skipped_module(frame.f_globals.get('__name__')):
|
||||
return False
|
||||
if frame is self.stopframe:
|
||||
if self.stoplineno == -1:
|
||||
@@ -696,7 +696,7 @@ class QtcInternalDumper:
|
||||
return None, None, line
|
||||
i, length = 0, len(line)
|
||||
while i < length and line[i] in self.identchars:
|
||||
i = i+1
|
||||
i = i + 1
|
||||
cmd, arg = line[:i], line[i:].strip()
|
||||
return cmd, arg, line
|
||||
|
||||
@@ -745,10 +745,10 @@ class QtcInternalDumper:
|
||||
|
||||
import __main__
|
||||
# __main__.__dict__.clear()
|
||||
__main__.__dict__.update({'__name__' : '__main__',
|
||||
'__file__' : mainpyfile,
|
||||
# '__builtins__': __builtins__,
|
||||
})
|
||||
__main__.__dict__.update({'__name__': '__main__',
|
||||
'__file__': mainpyfile,
|
||||
#'__builtins__': __builtins__,
|
||||
})
|
||||
|
||||
# When bdb sets tracing, a number of call and line events happens
|
||||
# BEFORE debugger even reaches user's code (and the exact sequence of
|
||||
@@ -966,7 +966,7 @@ class QtcInternalDumper:
|
||||
comma = arg.find(',')
|
||||
if comma > 0:
|
||||
# parse stuff after comma: 'condition'
|
||||
cond = arg[comma+1:].lstrip()
|
||||
cond = arg[comma + 1:].lstrip()
|
||||
arg = arg[:comma].rstrip()
|
||||
# parse stuff before comma: [filename:]lineno | function
|
||||
colon = arg.rfind(':')
|
||||
@@ -979,7 +979,7 @@ class QtcInternalDumper:
|
||||
return
|
||||
else:
|
||||
filename = f
|
||||
arg = arg[colon+1:].lstrip()
|
||||
arg = arg[colon + 1:].lstrip()
|
||||
try:
|
||||
lineno = int(arg)
|
||||
except ValueError:
|
||||
@@ -1212,7 +1212,7 @@ class QtcInternalDumper:
|
||||
# Make sure it works for 'clear C:\foo\bar.py:12'
|
||||
i = arg.rfind(':')
|
||||
filename = arg[:i]
|
||||
arg = arg[i+1:]
|
||||
arg = arg[i + 1:]
|
||||
try:
|
||||
lineno = int(arg)
|
||||
except ValueError:
|
||||
|
||||
+348
-233
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,15 @@
|
||||
[pycodestyle]
|
||||
max-line-length = 100
|
||||
ignore =
|
||||
# E222 - multiple spaces after operator: Used for alignments
|
||||
E222,
|
||||
# E241 - multiple spaces after ',': Used for alignments
|
||||
E241,
|
||||
# E265 - block comment should start with '# ': We have a bunch of #warn(foo) lines
|
||||
# a space after # would leave an incorrect indentation after uncommenting
|
||||
E265,
|
||||
# E402 - module level import not at top of file: Sometimes we need to adjust the sys.path before
|
||||
# we can import
|
||||
E402,
|
||||
# E722 - do not use bare except, specify exception instead: TODO
|
||||
E722
|
||||
@@ -26,9 +26,11 @@
|
||||
from utils import DisplayFormat
|
||||
from dumper import Children, SubItem
|
||||
|
||||
|
||||
def qform__std__array():
|
||||
return [DisplayFormat.ArrayPlotFormat]
|
||||
|
||||
|
||||
def qdump__std__array(d, value):
|
||||
size = value.type[1]
|
||||
d.putItemCount(size)
|
||||
@@ -39,6 +41,7 @@ def qdump__std__array(d, value):
|
||||
def qform__std____1__array():
|
||||
return [DisplayFormat.ArrayPlotFormat]
|
||||
|
||||
|
||||
def qdump__std____1__array(d, value):
|
||||
qdump__std__array(d, value)
|
||||
|
||||
@@ -66,6 +69,7 @@ def qdump__std__complex(d, value):
|
||||
d.putSubItem("real", real)
|
||||
d.putSubItem("imag", imag)
|
||||
|
||||
|
||||
def qdump__std____1__complex(d, value):
|
||||
qdump__std__complex(d, value)
|
||||
|
||||
@@ -85,7 +89,7 @@ def qdump__std__deque(d, value):
|
||||
bufsize = 512 // innerSize
|
||||
|
||||
(mapptr, mapsize, startCur, startFirst, startLast, startNode,
|
||||
finishCur, finishFirst, finishLast, finishNode) = value.split("pppppppppp")
|
||||
finishCur, finishFirst, finishLast, finishNode) = value.split("pppppppppp")
|
||||
|
||||
size = bufsize * ((finishNode - startNode) // d.ptrSize() - 1)
|
||||
size += (finishCur - finishFirst) // innerSize
|
||||
@@ -108,6 +112,7 @@ def qdump__std__deque(d, value):
|
||||
pcur = pfirst
|
||||
pnode = newnode
|
||||
|
||||
|
||||
def qdump__std____1__deque(d, value):
|
||||
mptr, mfirst, mbegin, mend, start, size = value.split("pppptt")
|
||||
d.check(0 <= size and size <= 1000 * 1000 * 1000)
|
||||
@@ -123,6 +128,7 @@ def qdump__std____1__deque(d, value):
|
||||
base = d.extractPointer(mfirst + k * ptrSize)
|
||||
d.putSubItem(i, d.createValue(base + j * innerSize, innerType))
|
||||
|
||||
|
||||
def qdump__std__deque__QNX(d, value):
|
||||
innerType = value.type[0]
|
||||
innerSize = innerType.size()
|
||||
@@ -157,7 +163,8 @@ def qdump__std__deque__QNX(d, value):
|
||||
if mapsize <= block:
|
||||
block -= mapsize
|
||||
d.putSubItem(i, map[block][offset])
|
||||
myoff += 1;
|
||||
myoff += 1
|
||||
|
||||
|
||||
def qdump__std__deque__MSVC(d, value):
|
||||
innerType = value.type[0]
|
||||
@@ -187,6 +194,7 @@ def qdump__std__deque__MSVC(d, value):
|
||||
d.putSubItem(i, d.createValue(address, innerType))
|
||||
myoff += 1
|
||||
|
||||
|
||||
def qdump__std____debug__deque(d, value):
|
||||
qdump__std__deque(d, value)
|
||||
|
||||
@@ -218,6 +226,7 @@ def qdump__std__list(d, value):
|
||||
d.putSubItem(i, d.createValue(p + 2 * d.ptrSize(), innerType))
|
||||
p = d.extractPointer(p)
|
||||
|
||||
|
||||
def qdump__std__list__QNX(d, value):
|
||||
(proxy, head, size) = value.split("ppp")
|
||||
d.putItemCount(size, 1000)
|
||||
@@ -230,12 +239,15 @@ def qdump__std__list__QNX(d, value):
|
||||
d.putSubItem(i, d.createValue(p + 2 * d.ptrSize(), innerType))
|
||||
p = d.extractPointer(p)
|
||||
|
||||
|
||||
def qdump__std____debug__list(d, value):
|
||||
qdump__std__list(d, value)
|
||||
|
||||
|
||||
def qdump__std____cxx11__list(d, value):
|
||||
qdump__std__list(d, value)
|
||||
|
||||
|
||||
def qdump__std____1__list(d, value):
|
||||
if value.type.size() == 3 * d.ptrSize():
|
||||
# C++11 only.
|
||||
@@ -260,9 +272,11 @@ def qdump__std____1__list(d, value):
|
||||
(prev, p, val) = d.split(typeCode, p)
|
||||
d.putSubItem(i, val)
|
||||
|
||||
|
||||
def qform__std__map():
|
||||
return [DisplayFormat.CompactMapFormat]
|
||||
|
||||
|
||||
def qdump__std__map(d, value):
|
||||
if d.isQnxTarget() or d.isMsvcTarget():
|
||||
qdump_std__map__helper(d, value)
|
||||
@@ -270,7 +284,7 @@ def qdump__std__map(d, value):
|
||||
|
||||
# stuff is actually (color, pad) with 'I@', but we can save cycles/
|
||||
(compare, stuff, parent, left, right, size) = value.split('pppppp')
|
||||
d.check(0 <= size and size <= 100*1000*1000)
|
||||
d.check(0 <= size and size <= 100 * 1000 * 1000)
|
||||
d.putItemCount(size)
|
||||
|
||||
if d.isExpanded():
|
||||
@@ -299,16 +313,19 @@ def qdump__std__map(d, value):
|
||||
break
|
||||
node = node["_M_left"]
|
||||
|
||||
|
||||
def qdump_std__map__helper(d, value):
|
||||
(proxy, head, size) = value.split("ppp")
|
||||
d.check(0 <= size and size <= 100*1000*1000)
|
||||
d.check(0 <= size and size <= 100 * 1000 * 1000)
|
||||
d.putItemCount(size)
|
||||
if d.isExpanded():
|
||||
keyType = value.type[0]
|
||||
valueType = value.type[1]
|
||||
pairType = value.type[3][0]
|
||||
|
||||
def helper(node):
|
||||
(left, parent, right, color, isnil, pad, pair) = d.split("pppcc@{%s}" % (pairType.name), node)
|
||||
(left, parent, right, color, isnil, pad, pair) = d.split(
|
||||
"pppcc@{%s}" % (pairType.name), node)
|
||||
if left != head:
|
||||
for res in helper(left):
|
||||
yield res
|
||||
@@ -322,24 +339,31 @@ def qdump_std__map__helper(d, value):
|
||||
for (pair, i) in zip(helper(root), d.childRange()):
|
||||
d.putPairItem(i, pair)
|
||||
|
||||
|
||||
def qdump__std____debug__map(d, value):
|
||||
qdump__std__map(d, value)
|
||||
|
||||
|
||||
def qdump__std____debug__set(d, value):
|
||||
qdump__std__set(d, value)
|
||||
|
||||
|
||||
def qdump__std__multiset(d, value):
|
||||
qdump__std__set(d, value)
|
||||
|
||||
|
||||
def qdump__std____cxx1998__map(d, value):
|
||||
qdump__std__map(d, value)
|
||||
|
||||
|
||||
def qform__std__multimap():
|
||||
return [DisplayFormat.CompactMapFormat]
|
||||
|
||||
|
||||
def qdump__std__multimap(d, value):
|
||||
return qdump__std__map(d, value)
|
||||
|
||||
|
||||
def qdumpHelper__std__tree__iterator(d, value, isSet=False):
|
||||
treeTypeName = None
|
||||
if value.type.name.endswith("::iterator"):
|
||||
@@ -375,30 +399,39 @@ def qdumpHelper__std__tree__iterator(d, value, isSet=False):
|
||||
d.putSubItem("right", d.createValue(right, nodeType))
|
||||
d.putSubItem("parent", d.createValue(parent, nodeType))
|
||||
|
||||
|
||||
def qdump__std___Rb_tree_iterator(d, value):
|
||||
qdumpHelper__std__tree__iterator(d, value)
|
||||
|
||||
|
||||
def qdump__std___Rb_tree_const_iterator(d, value):
|
||||
qdumpHelper__std__tree__iterator(d, value)
|
||||
|
||||
|
||||
def qdump__std__map__iterator(d, value):
|
||||
qdumpHelper__std__tree__iterator(d, value)
|
||||
|
||||
|
||||
def qdump____gnu_debug___Safe_iterator(d, value):
|
||||
d.putItem(value["_M_current"])
|
||||
|
||||
|
||||
def qdump__std__map__const_iterator(d, value):
|
||||
qdumpHelper__std__tree__iterator(d, value)
|
||||
|
||||
|
||||
def qdump__std__set__iterator(d, value):
|
||||
qdumpHelper__std__tree__iterator(d, value, True)
|
||||
|
||||
|
||||
def qdump__std__set__const_iterator(d, value):
|
||||
qdumpHelper__std__tree__iterator(d, value, True)
|
||||
|
||||
|
||||
def qdump__std____cxx1998__set(d, value):
|
||||
qdump__std__set(d, value)
|
||||
|
||||
|
||||
def qdumpHelper__std__tree__iterator_MSVC(d, value):
|
||||
d.putNumChild(1)
|
||||
d.putEmptyValue()
|
||||
@@ -416,9 +449,11 @@ def qdumpHelper__std__tree__iterator_MSVC(d, value):
|
||||
else:
|
||||
d.putSubItem("value", child)
|
||||
|
||||
|
||||
def qdump__std___Tree_const_iterator(d, value):
|
||||
qdumpHelper__std__tree__iterator_MSVC(d, value)
|
||||
|
||||
|
||||
def qdump__std___Tree_iterator(d, value):
|
||||
qdumpHelper__std__tree__iterator_MSVC(d, value)
|
||||
|
||||
@@ -430,7 +465,7 @@ def qdump__std__set(d, value):
|
||||
|
||||
impl = value["_M_t"]["_M_impl"]
|
||||
size = impl["_M_node_count"].integer()
|
||||
d.check(0 <= size and size <= 100*1000*1000)
|
||||
d.check(0 <= size and size <= 100 * 1000 * 1000)
|
||||
d.putItemCount(size)
|
||||
if d.isExpanded():
|
||||
valueType = value.type[0]
|
||||
@@ -453,14 +488,17 @@ def qdump__std__set(d, value):
|
||||
while node["_M_left"].pointer() != 0:
|
||||
node = node["_M_left"]
|
||||
|
||||
|
||||
def qdump__std__set__QNX(d, value):
|
||||
(proxy, head, size) = value.split("ppp")
|
||||
d.check(0 <= size and size <= 100*1000*1000)
|
||||
d.check(0 <= size and size <= 100 * 1000 * 1000)
|
||||
d.putItemCount(size)
|
||||
if d.isExpanded():
|
||||
childType=value.type[0]
|
||||
childType = value.type[0]
|
||||
|
||||
def helper(node):
|
||||
(left, parent, right, color, isnil, pad, value) = d.split("pppcc@{%s}" % childType.name, node)
|
||||
(left, parent, right, color, isnil, pad, value) = d.split(
|
||||
"pppcc@{%s}" % childType.name, node)
|
||||
if left != head:
|
||||
for res in helper(left):
|
||||
yield res
|
||||
@@ -474,6 +512,7 @@ def qdump__std__set__QNX(d, value):
|
||||
for (item, i) in zip(helper(root), d.childRange()):
|
||||
d.putSubItem(i, item)
|
||||
|
||||
|
||||
def std1TreeMin(d, node):
|
||||
#_NodePtr __tree_min(_NodePtr __x):
|
||||
# while (__x->__left_ != nullptr)
|
||||
@@ -485,6 +524,7 @@ def std1TreeMin(d, node):
|
||||
node = left
|
||||
return node
|
||||
|
||||
|
||||
def std1TreeIsLeftChild(d, node):
|
||||
# bool __tree_is_left_child(_NodePtr __x):
|
||||
# return __x == __x->__parent_->__left_;
|
||||
@@ -508,10 +548,11 @@ def std1TreeNext(d, node):
|
||||
node = node['__parent_']
|
||||
return node['__parent_']
|
||||
|
||||
|
||||
def qdump__std____1__set(d, value):
|
||||
(proxy, head, size) = value.split("ppp")
|
||||
|
||||
d.check(0 <= size and size <= 100*1000*1000)
|
||||
d.check(0 <= size and size <= 100 * 1000 * 1000)
|
||||
d.putItemCount(size)
|
||||
|
||||
if d.isExpanded():
|
||||
@@ -534,21 +575,24 @@ def qdump__std____1__set(d, value):
|
||||
for (i, data) in zip(d.childRange(), in_order_traversal(head)):
|
||||
d.putSubItem(i, data)
|
||||
|
||||
|
||||
def qdump__std____1__multiset(d, value):
|
||||
qdump__std____1__set(d, value)
|
||||
|
||||
|
||||
def qform__std____1__map():
|
||||
return [DisplayFormat.CompactMapFormat]
|
||||
|
||||
|
||||
def qdump__std____1__map(d, value):
|
||||
try:
|
||||
(proxy, head, size) = value.split("ppp")
|
||||
d.check(0 <= size and size <= 100*1000*1000)
|
||||
d.check(0 <= size and size <= 100 * 1000 * 1000)
|
||||
|
||||
# Sometimes there is extra data at the front. Don't know why at the moment.
|
||||
except RuntimeError:
|
||||
(junk, proxy, head, size) = value.split("pppp")
|
||||
d.check(0 <= size and size <= 100*1000*1000)
|
||||
d.check(0 <= size and size <= 100 * 1000 * 1000)
|
||||
|
||||
d.putItemCount(size)
|
||||
|
||||
@@ -574,12 +618,15 @@ def qdump__std____1__map(d, value):
|
||||
for (i, pair) in zip(d.childRange(), in_order_traversal(head)):
|
||||
d.putPairItem(i, pair, 'key', 'value')
|
||||
|
||||
|
||||
def qform__std____1__multimap():
|
||||
return [DisplayFormat.CompactMapFormat]
|
||||
|
||||
|
||||
def qdump__std____1__multimap(d, value):
|
||||
qdump__std____1__map(d, value)
|
||||
|
||||
|
||||
def qdump__std____1__map__iterator(d, value):
|
||||
d.putEmptyValue()
|
||||
if d.isExpanded():
|
||||
@@ -588,9 +635,11 @@ def qdump__std____1__map__iterator(d, value):
|
||||
d.putSubItem('first', node['first'])
|
||||
d.putSubItem('second', node['second'])
|
||||
|
||||
|
||||
def qdump__std____1__map__const_iterator(d, value):
|
||||
qdump__std____1__map__iterator(d, value)
|
||||
|
||||
|
||||
def qdump__std____1__set__iterator(d, value):
|
||||
d.putEmptyValue()
|
||||
d.putNumChild(1)
|
||||
@@ -606,27 +655,34 @@ def qdump__std____1__set__iterator(d, value):
|
||||
node = node.cast(keyType)
|
||||
d.putSubItem('value', node)
|
||||
|
||||
|
||||
def qdump__std____1__set_const_iterator(d, value):
|
||||
qdump__std____1__set__iterator(d, value)
|
||||
|
||||
|
||||
def qdump__std__stack(d, value):
|
||||
d.putItem(value["c"])
|
||||
d.putBetterType(value.type)
|
||||
|
||||
|
||||
def qdump__std____debug__stack(d, value):
|
||||
qdump__std__stack(d, value)
|
||||
|
||||
|
||||
def qdump__std____1__stack(d, value):
|
||||
d.putItem(value["c"])
|
||||
d.putBetterType(value.type)
|
||||
|
||||
|
||||
def qform__std__string():
|
||||
return [DisplayFormat.Latin1StringFormat, DisplayFormat.SeparateLatin1StringFormat,
|
||||
DisplayFormat.Utf8StringFormat, DisplayFormat.SeparateUtf8StringFormat ]
|
||||
DisplayFormat.Utf8StringFormat, DisplayFormat.SeparateUtf8StringFormat]
|
||||
|
||||
|
||||
def qdump__std__string(d, value):
|
||||
qdumpHelper_std__string(d, value, d.createType("char"), d.currentItemFormat())
|
||||
|
||||
|
||||
def qdumpHelper_std__string(d, value, charType, format):
|
||||
if d.isQnxTarget():
|
||||
qdumpHelper__std__string__QNX(d, value, charType, format)
|
||||
@@ -650,34 +706,37 @@ def qdumpHelper_std__string(d, value, charType, format):
|
||||
# struct { size_type _M_length, size_type _M_capacity, int _M_refcount; }
|
||||
(size, alloc, refcount) = d.split("ppp", data - 3 * d.ptrSize())
|
||||
refcount = refcount & 0xffffffff
|
||||
d.check(refcount >= -1) # Can be -1 according to docs.
|
||||
d.check(0 <= size and size <= alloc and alloc <= 100*1000*1000)
|
||||
d.check(refcount >= -1) # Can be -1 according to docs.
|
||||
d.check(0 <= size and size <= alloc and alloc <= 100 * 1000 * 1000)
|
||||
d.putCharArrayHelper(data, size, charType, format)
|
||||
|
||||
|
||||
def qdumpHelper__std__string__QNX(d, value, charType, format):
|
||||
size = value['_Mysize']
|
||||
alloc = value['_Myres']
|
||||
_BUF_SIZE = int(16 / charType.size())
|
||||
if _BUF_SIZE <= alloc: #(_BUF_SIZE <= _Myres ? _Bx._Ptr : _Bx._Buf);
|
||||
if _BUF_SIZE <= alloc: # (_BUF_SIZE <= _Myres ? _Bx._Ptr : _Bx._Buf);
|
||||
data = value['_Bx']['_Ptr']
|
||||
else:
|
||||
data = value['_Bx']['_Buf']
|
||||
sizePtr = data.cast(d.charType().pointer())
|
||||
refcount = int(sizePtr[-1])
|
||||
d.check(refcount >= -1) # Can be -1 accoring to docs.
|
||||
d.check(0 <= size and size <= alloc and alloc <= 100*1000*1000)
|
||||
d.check(refcount >= -1) # Can be -1 accoring to docs.
|
||||
d.check(0 <= size and size <= alloc and alloc <= 100 * 1000 * 1000)
|
||||
d.putCharArrayHelper(sizePtr, size, charType, format)
|
||||
|
||||
|
||||
def qdumpHelper__std__string__MSVC(d, value, charType, format):
|
||||
(proxy, buffer, size, alloc) = value.split("p16spp");
|
||||
_BUF_SIZE = int(16 / charType.size());
|
||||
d.check(0 <= size and size <= alloc and alloc <= 100*1000*1000)
|
||||
(proxy, buffer, size, alloc) = value.split("p16spp")
|
||||
_BUF_SIZE = int(16 / charType.size())
|
||||
d.check(0 <= size and size <= alloc and alloc <= 100 * 1000 * 1000)
|
||||
if _BUF_SIZE <= alloc:
|
||||
(proxy, data) = value.split("pp");
|
||||
(proxy, data) = value.split("pp")
|
||||
else:
|
||||
data = value.address() + d.ptrSize()
|
||||
d.putCharArrayHelper(data, size, charType, format)
|
||||
|
||||
|
||||
def qdump__std____1__string(d, value):
|
||||
firstByte = value.split('b')[0]
|
||||
if int(firstByte & 1) == 0:
|
||||
@@ -707,9 +766,11 @@ def qdump__std____1__wstring(d, value):
|
||||
def qdump__std____weak_ptr(d, value):
|
||||
return qdump__std__shared_ptr(d, value)
|
||||
|
||||
|
||||
def qdump__std__weak_ptr(d, value):
|
||||
return qdump__std__shared_ptr(d, value)
|
||||
|
||||
|
||||
def qdump__std____1__weak_ptr(d, value):
|
||||
return qdump__std____1__shared_ptr(d, value)
|
||||
|
||||
@@ -727,6 +788,7 @@ def qdump__std__shared_ptr(d, value):
|
||||
d.putItem(i.dereference())
|
||||
d.putBetterType(value.type)
|
||||
|
||||
|
||||
def qdump__std____1__shared_ptr(d, value):
|
||||
i = value["__ptr_"]
|
||||
if i.pointer() == 0:
|
||||
@@ -736,6 +798,7 @@ def qdump__std____1__shared_ptr(d, value):
|
||||
d.putItem(i.dereference())
|
||||
d.putBetterType(value.type)
|
||||
|
||||
|
||||
def qdump__std__unique_ptr(d, value):
|
||||
p = d.extractPointer(value)
|
||||
if p == 0:
|
||||
@@ -745,6 +808,7 @@ def qdump__std__unique_ptr(d, value):
|
||||
d.putItem(d.createValue(p, value.type[0]))
|
||||
d.putBetterType(value.type)
|
||||
|
||||
|
||||
def qdump__std____1__unique_ptr(d, value):
|
||||
qdump__std__unique_ptr(d, value)
|
||||
|
||||
@@ -760,12 +824,15 @@ def qdump__std__pair(d, value):
|
||||
d.putField('keyencoded', key.encoding)
|
||||
d.putValue(value.value, value.encoding)
|
||||
|
||||
|
||||
def qform__std__unordered_map():
|
||||
return [DisplayFormat.CompactMapFormat]
|
||||
|
||||
|
||||
def qform__std____debug__unordered_map():
|
||||
return [DisplayFormat.CompactMapFormat]
|
||||
|
||||
|
||||
def qdump__std__unordered_map(d, value):
|
||||
if d.isQnxTarget() or d.isMsvcTarget():
|
||||
qdump__std__list__QNX(d, value["_List"])
|
||||
@@ -806,6 +873,7 @@ def qdump__std__unordered_map(d, value):
|
||||
p, pad, key, pad, val = d.split(typeCode, p)
|
||||
d.putPairItem(i, (key, val))
|
||||
|
||||
|
||||
def qdump__std____debug__unordered_map(d, value):
|
||||
qdump__std__unordered_map(d, value)
|
||||
|
||||
@@ -813,12 +881,15 @@ def qdump__std____debug__unordered_map(d, value):
|
||||
def qform__std__unordered_multimap():
|
||||
return qform__std__unordered_map()
|
||||
|
||||
|
||||
def qform__std____debug__unordered_multimap():
|
||||
return qform__std____debug__unordered_map()
|
||||
|
||||
|
||||
def qdump__std__unordered_multimap(d, value):
|
||||
qdump__std__unordered_map(d, value)
|
||||
|
||||
|
||||
def qdump__std____debug__unordered_multimap(d, value):
|
||||
qdump__std__unordered_multimap(d, value)
|
||||
|
||||
@@ -861,9 +932,11 @@ def qdump__std__unordered_set(d, value):
|
||||
d.putSubItem(i, d.createValue(p + ptrSize - offset, valueType))
|
||||
p = d.extractPointer(p + offset)
|
||||
|
||||
|
||||
def qform__std____1__unordered_map():
|
||||
return [DisplayFormat.CompactMapFormat]
|
||||
|
||||
|
||||
def qdump__std____1__unordered_map(d, value):
|
||||
(size, _) = value["__table_"]["__p2_"].split("pp")
|
||||
d.putItemCount(size)
|
||||
@@ -909,9 +982,11 @@ def qdump__std____1__unordered_set(d, value):
|
||||
def qdump__std____debug__unordered_set(d, value):
|
||||
qdump__std__unordered_set(d, value)
|
||||
|
||||
|
||||
def qdump__std__unordered_multiset(d, value):
|
||||
qdump__std__unordered_set(d, value)
|
||||
|
||||
|
||||
def qdump__std____debug__unordered_multiset(d, value):
|
||||
qdump__std__unordered_multiset(d, value)
|
||||
|
||||
@@ -919,6 +994,7 @@ def qdump__std____debug__unordered_multiset(d, value):
|
||||
def qform__std__valarray():
|
||||
return [DisplayFormat.ArrayPlotFormat]
|
||||
|
||||
|
||||
def qdump__std__valarray(d, value):
|
||||
if d.isMsvcTarget():
|
||||
(data, size) = value.split('pp')
|
||||
@@ -931,6 +1007,7 @@ def qdump__std__valarray(d, value):
|
||||
def qform__std____1__valarray():
|
||||
return [DisplayFormat.ArrayPlotFormat]
|
||||
|
||||
|
||||
def qdump__std____1__valarray(d, value):
|
||||
innerType = value.type[0]
|
||||
(begin, end) = value.split('pp')
|
||||
@@ -942,6 +1019,7 @@ def qdump__std____1__valarray(d, value):
|
||||
def qform__std__vector():
|
||||
return [DisplayFormat.ArrayPlotFormat]
|
||||
|
||||
|
||||
def qedit__std__vector(d, value, data):
|
||||
import gdb
|
||||
values = data.split(',')
|
||||
@@ -954,12 +1032,14 @@ def qedit__std__vector(d, value, data):
|
||||
cmd = "set (%s[%d])*$d={%s}" % (innerType, n, data)
|
||||
gdb.execute(cmd)
|
||||
|
||||
|
||||
def qdump__std__vector(d, value):
|
||||
if d.isQnxTarget() or d.isMsvcTarget():
|
||||
qdumpHelper__std__vector__QNX(d, value)
|
||||
else:
|
||||
qdumpHelper__std__vector(d, value, False)
|
||||
|
||||
|
||||
def qdumpHelper__std__vector(d, value, isLibCpp):
|
||||
innerType = value.type[0]
|
||||
isBool = innerType.name == 'bool'
|
||||
@@ -975,7 +1055,7 @@ def qdumpHelper__std__vector(d, value, isLibCpp):
|
||||
finish = value["_M_finish"]["_M_p"].pointer()
|
||||
foffset = value["_M_finish"]["_M_offset"].integer()
|
||||
alloc = value["_M_end_of_storage"].pointer()
|
||||
size = (finish - start) * 8 + foffset - soffset # 8 is CHAR_BIT.
|
||||
size = (finish - start) * 8 + foffset - soffset # 8 is CHAR_BIT.
|
||||
else:
|
||||
if isLibCpp:
|
||||
start = value["__begin_"].pointer()
|
||||
@@ -1007,6 +1087,7 @@ def qdumpHelper__std__vector(d, value, isLibCpp):
|
||||
else:
|
||||
d.putPlotData(start, size, innerType)
|
||||
|
||||
|
||||
def qdumpHelper__std__vector__QNX(d, value):
|
||||
innerType = value.type[0]
|
||||
isBool = innerType.name == 'bool'
|
||||
@@ -1036,15 +1117,19 @@ def qdumpHelper__std__vector__QNX(d, value):
|
||||
else:
|
||||
d.putPlotData(start, size, innerType)
|
||||
|
||||
|
||||
def qform__std____1__vector():
|
||||
return [DisplayFormat.ArrayPlotFormat]
|
||||
|
||||
|
||||
def qdump__std____1__vector(d, value):
|
||||
qdumpHelper__std__vector(d, value, True)
|
||||
|
||||
|
||||
def qform__std____debug__vector():
|
||||
return [DisplayFormat.ArrayPlotFormat]
|
||||
|
||||
|
||||
def qdump__std____debug__vector(d, value):
|
||||
qdump__std__vector(d, value)
|
||||
|
||||
@@ -1067,37 +1152,48 @@ def qdump__std__initializer_list(d, value):
|
||||
if d.isExpanded():
|
||||
d.putPlotData(start, size, innerType)
|
||||
|
||||
|
||||
def qedit__std__string(d, value, data):
|
||||
d.call('void', value, 'assign', '"%s"' % data.replace('"', '\\"'))
|
||||
|
||||
|
||||
def qedit__string(d, expr, value):
|
||||
qedit__std__string(d, expr, value)
|
||||
|
||||
|
||||
def qedit__std____cxx11__string(d, expr, value):
|
||||
qedit__std__string(d, expr, value)
|
||||
|
||||
|
||||
def qedit__std__wstring(d, value, data):
|
||||
d.call('void', value, 'assign', 'L"%s"' % data.replace('"', '\\"'))
|
||||
|
||||
|
||||
def qedit__wstring(d, expr, value):
|
||||
qedit__std__wstring(d, expr, value)
|
||||
|
||||
|
||||
def qedit__std____cxx11__wstring(d, expr, value):
|
||||
qedit__std__wstring(d, expr, value)
|
||||
|
||||
|
||||
def qdump__string(d, value):
|
||||
qdump__std__string(d, value)
|
||||
|
||||
|
||||
def qform__std__wstring():
|
||||
return [DisplayFormat.SimpleFormat, DisplayFormat.SeparateFormat]
|
||||
|
||||
|
||||
def qdump__std__wstring(d, value):
|
||||
qdumpHelper_std__string(d, value, d.createType('wchar_t'), d.currentItemFormat())
|
||||
|
||||
|
||||
def qdump__std__basic_string(d, value):
|
||||
innerType = value.type[0]
|
||||
qdumpHelper_std__string(d, value, innerType, d.currentItemFormat())
|
||||
|
||||
|
||||
def qdump__std____cxx11__basic_string(d, value):
|
||||
innerType = value.type[0]
|
||||
try:
|
||||
@@ -1107,24 +1203,30 @@ def qdump__std____cxx11__basic_string(d, value):
|
||||
d.putEmptyValue()
|
||||
d.putPlainChildren(value)
|
||||
return
|
||||
d.check(0 <= size) #and size <= alloc and alloc <= 100*1000*1000)
|
||||
d.check(0 <= size) # and size <= alloc and alloc <= 100*1000*1000)
|
||||
d.putCharArrayHelper(data, size, innerType, d.currentItemFormat())
|
||||
|
||||
|
||||
def qform__std____cxx11__string(d, value):
|
||||
qform__std__string(d, value)
|
||||
|
||||
|
||||
def qdump__std____cxx11__string(d, value):
|
||||
(data, size) = value.split("pI")
|
||||
d.check(0 <= size) #and size <= alloc and alloc <= 100*1000*1000)
|
||||
d.check(0 <= size) # and size <= alloc and alloc <= 100*1000*1000)
|
||||
d.putCharArrayHelper(data, size, d.charType(), d.currentItemFormat())
|
||||
|
||||
# Needed only to trigger the form report above.
|
||||
|
||||
|
||||
def qform__std____cxx11__string():
|
||||
return qform__std__string()
|
||||
|
||||
|
||||
def qform__std____cxx11__wstring():
|
||||
return qform__std__wstring()
|
||||
|
||||
|
||||
def qdump__std____1__basic_string(d, value):
|
||||
innerType = value.type[0].name
|
||||
if innerType == "char":
|
||||
@@ -1134,12 +1236,15 @@ def qdump__std____1__basic_string(d, value):
|
||||
else:
|
||||
d.warn("UNKNOWN INNER TYPE %s" % innerType)
|
||||
|
||||
|
||||
def qdump__wstring(d, value):
|
||||
qdump__std__wstring(d, value)
|
||||
|
||||
|
||||
def qdump__std____1__once_flag(d, value):
|
||||
qdump__std__once_flag(d, value)
|
||||
|
||||
|
||||
def qdump__std__once_flag(d, value):
|
||||
d.putValue(value.split("i")[0])
|
||||
d.putBetterType(value.type)
|
||||
@@ -1174,14 +1279,17 @@ def qdump__uint8_t(d, value):
|
||||
d.putNumChild(0)
|
||||
d.putValue(value.integer())
|
||||
|
||||
|
||||
def qdump__int8_t(d, value):
|
||||
d.putNumChild(0)
|
||||
d.putValue(value.integer())
|
||||
|
||||
|
||||
def qdump__std__byte(d, value):
|
||||
d.putNumChild(0)
|
||||
d.putValue(value.integer())
|
||||
|
||||
|
||||
def qdump__std__optional(d, value):
|
||||
innerType = value.type[0]
|
||||
(payload, pad, initialized) = d.split('{%s}@b' % innerType.name, value)
|
||||
@@ -1192,5 +1300,6 @@ def qdump__std__optional(d, value):
|
||||
d.putSpecialValue("uninitialized")
|
||||
d.putNumChild(0)
|
||||
|
||||
|
||||
def qdump__std__experimental__optional(d, value):
|
||||
qdump__std__optional(d, value)
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
# Debugger start modes. Keep in sync with DebuggerStartMode in debuggerconstants.h
|
||||
|
||||
|
||||
class DebuggerStartMode:
|
||||
class DebuggerStartMode():
|
||||
(
|
||||
NoStartMode,
|
||||
StartInternal,
|
||||
@@ -41,7 +41,7 @@ class DebuggerStartMode:
|
||||
|
||||
|
||||
# Known special formats. Keep in sync with DisplayFormat in debuggerprotocol.h
|
||||
class DisplayFormat:
|
||||
class DisplayFormat():
|
||||
(
|
||||
AutomaticFormat,
|
||||
RawFormat,
|
||||
@@ -67,7 +67,7 @@ class DisplayFormat:
|
||||
|
||||
|
||||
# Breakpoints. Keep synchronized with BreakpointType in breakpoint.h
|
||||
class BreakpointType:
|
||||
class BreakpointType():
|
||||
(
|
||||
UnknownType,
|
||||
BreakpointByFileAndLine,
|
||||
@@ -87,7 +87,7 @@ class BreakpointType:
|
||||
|
||||
|
||||
# Internal codes for types keep in sync with cdbextensions pytype.cpp
|
||||
class TypeCode:
|
||||
class TypeCode():
|
||||
(
|
||||
TypeCodeTypedef,
|
||||
TypeCodeStruct,
|
||||
|
||||
Reference in New Issue
Block a user