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:
David Schulz
2020-02-24 14:37:56 +01:00
parent 8940522fe2
commit 0776340ad8
13 changed files with 1201 additions and 822 deletions
+6 -3
View File
@@ -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):
+25 -19
View File
@@ -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)
+41
View File
@@ -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)
File diff suppressed because it is too large Load Diff
+137 -127
View File
@@ -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)
+135 -122
View File
@@ -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)
+66 -44
View File
@@ -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)
+4 -1
View File
@@ -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]
+15 -15
View File
@@ -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:
File diff suppressed because it is too large Load Diff
+15
View File
@@ -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
+134 -25
View File
@@ -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)
+4 -4
View File
@@ -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,