Debugger: Fix display of QObject based thread names on Windows

Change-Id: I870d28ed3f5a5d013049acb2a94d05b983807228
Reviewed-by: hjk <hjk121@nokiamail.com>
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Reviewed-by: David Schulz <david.schulz@digia.com>
This commit is contained in:
hjk
2013-06-06 18:28:53 +02:00
parent 2846e54ad0
commit 47ddd1c525

View File

@@ -103,7 +103,7 @@ def listOfLocals(varList):
block = frame.block() block = frame.block()
#warn("BLOCK: %s " % block) #warn("BLOCK: %s " % block)
except RuntimeError, error: except RuntimeError, error:
warn("BLOCK IN FRAME NOT ACCESSIBLE: %s" % error) #warn("BLOCK IN FRAME NOT ACCESSIBLE: %s" % error)
return [] return []
except: except:
warn("BLOCK NOT ACCESSIBLE FOR UNKNOWN REASONS") warn("BLOCK NOT ACCESSIBLE FOR UNKNOWN REASONS")
@@ -2294,16 +2294,15 @@ class Dumper:
# #
####################################################################### #######################################################################
def threadnames(arg): def threadname(arg):
ns = qtNamespace()
out = '['
oldthread = gdb.selected_thread()
try: try:
inferior = selectedInferior()
for thread in inferior.threads():
maximalStackDepth = int(arg)
thread.switch()
e = gdb.selected_frame() e = gdb.selected_frame()
except:
return
d = Dumper("")
out = ""
maximalStackDepth = int(arg)
ns = qtNamespace()
while True: while True:
maximalStackDepth -= 1 maximalStackDepth -= 1
if maximalStackDepth < 0: if maximalStackDepth < 0:
@@ -2311,19 +2310,45 @@ def threadnames(arg):
e = e.older() e = e.older()
if e == None or e.name() == None: if e == None or e.name() == None:
break break
if e.name() == ns + "QThreadPrivate::start" or e.name() == "_ZN14QThreadPrivate5startEPv@4": if e.name() == ns + "QThreadPrivate::start" \
or e.name() == "_ZN14QThreadPrivate5startEPv@4":
try: try:
thrptr = e.read_var("thr").dereference() thrptr = e.read_var("thr").dereference()
obtype = lookupType(ns + "QObjectPrivate").pointer() obtype = lookupType(ns + "QObjectPrivate").pointer()
d_ptr = thrptr["d_ptr"]["d"].cast(obtype).dereference() d_ptr = thrptr["d_ptr"]["d"].cast(obtype).dereference()
try:
objectName = d_ptr["objectName"] objectName = d_ptr["objectName"]
out += '{valueencoded="'; except: # Qt 5
out += str(Hex4EncodedLittleEndianWithoutQuotes)+'",id="' p = d_ptr["extraData"]
out += str(thread.num) + '",value="' if not isNull(p):
out += encodeString(objectName) objectName = p.dereference()["objectName"]
out += '"},' if not objectName is None:
data, size, alloc = d.stringData(objectName)
if size > 0:
s = d.readRawMemory(data, 2 * size)
thread = gdb.selected_thread()
inner = '{valueencoded="';
inner += str(Hex4EncodedLittleEndianWithoutQuotes)+'",id="'
inner += str(thread.num) + '",value="'
inner += s
#inner += d.encodeString(objectName)
inner += '"},'
out += inner
except: except:
pass pass
return out
def threadnames(arg):
out = '['
oldthread = gdb.selected_thread()
try:
inferior = selectedInferior()
for thread in inferior.threads():
thread.switch()
out += threadname(arg)
except: except:
pass pass
oldthread.switch() oldthread.switch()