From e855de40377f135c5770637036acd45df63880d7 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 30 Apr 2015 15:52:33 +0200 Subject: [PATCH] Debugger: Fix GDB hanging This partially reverts commit e33da6a6b3c1b85d7bb6e961a60803eaf71afce5. GDB seems to hang while executing str(some_pointer) in some setups. Task-number: QTCREATORBUG-14374 Change-Id: Ia678533b9122e505b21ef6659d404239995ddb81 Reviewed-by: Orgad Shaneh Reviewed-by: Christian Stenger --- share/qtcreator/debugger/dumper.py | 17 +++-------------- share/qtcreator/debugger/gdbbridge.py | 8 ++++++++ share/qtcreator/debugger/lldbbridge.py | 4 ++++ 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index 6a3e2b5afcf..84b5f0fffe9 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -1040,21 +1040,8 @@ class DumperBase: return typeName = str(value.type) - innerType = value.type.target().unqualified() - innerTypeName = str(innerType) - goodPointer = False - try: - target = value.dereference() - str(target) # Dummy access. - if self.isLldb and target.GetError().Fail(): - pass - else: - goodPointer = True - except: - pass - - if not goodPointer: + if self.isBadPointer(value): # Failure to dereference a pointer should at least # show the value of a pointer. self.putValue(self.cleanAddress(value)) @@ -1063,6 +1050,8 @@ class DumperBase: return displayFormat = self.currentItemFormat(value.type) + innerType = value.type.target().unqualified() + innerTypeName = str(innerType) if innerTypeName == "void": #warn("VOID POINTER: %s" % displayFormat) diff --git a/share/qtcreator/debugger/gdbbridge.py b/share/qtcreator/debugger/gdbbridge.py index 7eae19cbc28..d2196891097 100644 --- a/share/qtcreator/debugger/gdbbridge.py +++ b/share/qtcreator/debugger/gdbbridge.py @@ -522,6 +522,14 @@ class Dumper(DumperBase): except: 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): typename = "::" + self.stripClassTag(str(typeobj)); # Avoid malloc symbol clash with QVector. diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py index 21066a53838..40f5dc938ee 100644 --- a/share/qtcreator/debugger/lldbbridge.py +++ b/share/qtcreator/debugger/lldbbridge.py @@ -365,6 +365,10 @@ class Dumper(DumperBase): #self.warn(" -> %s" % result) return result + def isBadPointer(self, value): + target = value.dereference() + return target.GetError().Fail() + def makeValue(self, type, *args): thread = self.currentThread() frame = thread.GetFrameAtIndex(0)