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,36 +2294,61 @@ class Dumper:
# #
####################################################################### #######################################################################
def threadnames(arg): def threadname(arg):
try:
e = gdb.selected_frame()
except:
return
d = Dumper("")
out = ""
maximalStackDepth = int(arg)
ns = qtNamespace() ns = qtNamespace()
while True:
maximalStackDepth -= 1
if maximalStackDepth < 0:
break
e = e.older()
if e == None or e.name() == None:
break
if e.name() == ns + "QThreadPrivate::start" \
or e.name() == "_ZN14QThreadPrivate5startEPv@4":
try:
thrptr = e.read_var("thr").dereference()
obtype = lookupType(ns + "QObjectPrivate").pointer()
d_ptr = thrptr["d_ptr"]["d"].cast(obtype).dereference()
try:
objectName = d_ptr["objectName"]
except: # Qt 5
p = d_ptr["extraData"]
if not isNull(p):
objectName = p.dereference()["objectName"]
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:
pass
return out
def threadnames(arg):
out = '[' out = '['
oldthread = gdb.selected_thread() oldthread = gdb.selected_thread()
try: try:
inferior = selectedInferior() inferior = selectedInferior()
for thread in inferior.threads(): for thread in inferior.threads():
maximalStackDepth = int(arg)
thread.switch() thread.switch()
e = gdb.selected_frame () out += threadname(arg)
while True:
maximalStackDepth -= 1
if maximalStackDepth < 0:
break
e = e.older()
if e == None or e.name() == None:
break
if e.name() == ns + "QThreadPrivate::start" or e.name() == "_ZN14QThreadPrivate5startEPv@4":
try:
thrptr = e.read_var("thr").dereference()
obtype = lookupType(ns + "QObjectPrivate").pointer()
d_ptr = thrptr["d_ptr"]["d"].cast(obtype).dereference()
objectName = d_ptr["objectName"]
out += '{valueencoded="';
out += str(Hex4EncodedLittleEndianWithoutQuotes)+'",id="'
out += str(thread.num) + '",value="'
out += encodeString(objectName)
out += '"},'
except:
pass
except: except:
pass pass
oldthread.switch() oldthread.switch()