forked from qt-creator/qt-creator
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:
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user