Debugger: Fix GDB hanging

This partially reverts commit e33da6a6b3.
GDB seems to hang while executing str(some_pointer) in some setups.

Task-number: QTCREATORBUG-14374
Change-Id: Ia678533b9122e505b21ef6659d404239995ddb81
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Reviewed-by: Christian Stenger <christian.stenger@theqtcompany.com>
This commit is contained in:
hjk
2015-04-30 15:52:33 +02:00
parent 74066f25b4
commit e855de4037
3 changed files with 15 additions and 14 deletions

View File

@@ -1040,21 +1040,8 @@ class DumperBase:
return return
typeName = str(value.type) typeName = str(value.type)
innerType = value.type.target().unqualified()
innerTypeName = str(innerType)
goodPointer = False if self.isBadPointer(value):
try:
target = value.dereference()
str(target) # Dummy access.
if self.isLldb and target.GetError().Fail():
pass
else:
goodPointer = True
except:
pass
if not goodPointer:
# Failure to dereference a pointer should at least # Failure to dereference a pointer should at least
# show the value of a pointer. # show the value of a pointer.
self.putValue(self.cleanAddress(value)) self.putValue(self.cleanAddress(value))
@@ -1063,6 +1050,8 @@ class DumperBase:
return return
displayFormat = self.currentItemFormat(value.type) displayFormat = self.currentItemFormat(value.type)
innerType = value.type.target().unqualified()
innerTypeName = str(innerType)
if innerTypeName == "void": if innerTypeName == "void":
#warn("VOID POINTER: %s" % displayFormat) #warn("VOID POINTER: %s" % displayFormat)

View File

@@ -522,6 +522,14 @@ class Dumper(DumperBase):
except: except:
return None return None
def isBadPointer(self, value):
try:
target = value.dereference()
target.is_optimized_out # Access test.
return False
except:
return True
def makeValue(self, typeobj, init): def makeValue(self, typeobj, init):
typename = "::" + self.stripClassTag(str(typeobj)); typename = "::" + self.stripClassTag(str(typeobj));
# Avoid malloc symbol clash with QVector. # Avoid malloc symbol clash with QVector.

View File

@@ -365,6 +365,10 @@ class Dumper(DumperBase):
#self.warn(" -> %s" % result) #self.warn(" -> %s" % result)
return result return result
def isBadPointer(self, value):
target = value.dereference()
return target.GetError().Fail()
def makeValue(self, type, *args): def makeValue(self, type, *args):
thread = self.currentThread() thread = self.currentThread()
frame = thread.GetFrameAtIndex(0) frame = thread.GetFrameAtIndex(0)