Skip to content
Snippets Groups Projects
Commit 73fdc207 authored by hjk's avatar hjk
Browse files

debugger: make dumper more robust in optimized code


Change-Id: Ia398caf0fd29e6ac77502d870e8c9b615d4f395e
Reviewed-by: default avatarhjk <qthjk@ovi.com>
parent e70665d3
No related branches found
No related tags found
No related merge requests found
...@@ -119,7 +119,6 @@ try: ...@@ -119,7 +119,6 @@ try:
# "NotImplementedError: Symbol type not yet supported in # "NotImplementedError: Symbol type not yet supported in
# Python scripts." # Python scripts."
#warn("SYMBOL %s: " % symbol.value)
#warn("SYMBOL %s (%s): " % (symbol, name)) #warn("SYMBOL %s (%s): " % (symbol, name))
if name in shadowed: if name in shadowed:
level = shadowed[name] level = shadowed[name]
...@@ -133,19 +132,41 @@ try: ...@@ -133,19 +132,41 @@ try:
item.iname = "local." + name1 item.iname = "local." + name1
item.name = name1 item.name = name1
try: try:
item.value = frame.read_var(name, block) # this is a gdb value item.value = frame.read_var(name, block)
#warn("READ 1: %s" % item.value)
if not item.value.is_optimized_out:
#warn("ITEM 1: %s" % item.value)
items.append(item)
continue
except: except:
try: pass
item.value = frame.read_var(name) # this is a gdb value
except: try:
# RuntimeError: happens for item.value = frame.read_var(name)
# void foo() { std::string s; std::wstring w; } #warn("READ 2: %s" % item.value)
# ValueError: happens for (as of 2010/11/4) if not item.value.is_optimized_out:
# a local struct as found e.g. in #warn("ITEM 2: %s" % item.value)
# gcc sources in gcc.c, int execute() items.append(item)
continue continue
#warn("ITEM %s: " % item.value) except:
items.append(item) # RuntimeError: happens for
# void foo() { std::string s; std::wstring w; }
# ValueError: happens for (as of 2010/11/4)
# a local struct as found e.g. in
# gcc sources in gcc.c, int execute()
pass
try:
#warn("READ 3: %s %s" % (name, item.value))
item.value = gdb.parse_and_eval(name)
#warn("ITEM 3: %s" % item.value)
items.append(item)
except:
# Can happen in inlined code (see last line of
# RowPainter::paintChars(): "RuntimeError:
# No symbol \"__val\" in current context.\n"
pass
# The outermost block in a function has the function member # The outermost block in a function has the function member
# FIXME: check whether this is guaranteed. # FIXME: check whether this is guaranteed.
if not block.function is None: if not block.function is None:
......
...@@ -1391,16 +1391,6 @@ class Dumper: ...@@ -1391,16 +1391,6 @@ class Dumper:
type = value.type.unqualified() type = value.type.unqualified()
typeName = str(type) typeName = str(type)
try:
if value.is_optimized_out:
self.putValue("<optimized out>")
self.putType(typeName)
self.putNumChild(0)
return
except:
pass
# FIXME: Gui shows references stripped? # FIXME: Gui shows references stripped?
#warn(" ") #warn(" ")
#warn("REAL INAME: %s " % self.currentIName) #warn("REAL INAME: %s " % self.currentIName)
...@@ -1409,44 +1399,65 @@ class Dumper: ...@@ -1409,44 +1399,65 @@ class Dumper:
#warn("REAL VALUE: %s " % value) #warn("REAL VALUE: %s " % value)
if type.code == ReferenceCode: if type.code == ReferenceCode:
#try: try:
# This throws "RuntimeError: Attempt to dereference a # FIXME: This throws "RuntimeError: Attempt to dereference a
# generic pointer." with MinGW's gcc 4.5 when it "identifies" # generic pointer." with MinGW's gcc 4.5 when it "identifies"
# a "QWidget &" as "void &". # a "QWidget &" as "void &" and with optimized out code.
self.putItem(value.cast(type.target())) self.putItem(value.cast(type.target().unqualified()))
return
except RuntimeError:
self.putValue("<optimized out reference>")
self.putType(typeName)
self.putNumChild(0)
return return
#except RuntimeError:
# pass
if type.code == IntCode or type.code == CharCode: if type.code == IntCode or type.code == CharCode:
self.putAddress(value.address) self.putAddress(value.address)
self.putType(typeName) self.putType(typeName)
self.putValue(int(value)) if value.is_optimized_out:
self.putValue("<optimized out>")
else:
self.putValue(int(value))
self.putNumChild(0) self.putNumChild(0)
return return
if type.code == FloatCode or type.code == BoolCode: if type.code == FloatCode or type.code == BoolCode:
self.putAddress(value.address) self.putAddress(value.address)
self.putType(typeName) self.putType(typeName)
self.putValue(value) if value.is_optimized_out:
self.putValue("<optimized out>")
else:
self.putValue(value)
self.putNumChild(0) self.putNumChild(0)
return return
if type.code == EnumCode: if type.code == EnumCode:
self.putAddress(value.address)
self.putType(typeName) self.putType(typeName)
self.putValue("%s (%d)" % (value, value)) if value.is_optimized_out:
self.putValue("<optimized out>")
else:
self.putValue("%s (%d)" % (value, value))
self.putNumChild(0) self.putNumChild(0)
return return
if type.code == TypedefCode: if type.code == TypedefCode:
type = type.strip_typedefs() type = stripTypedefs(type)
# The cast can destroy the address? # The cast can destroy the address?
self.putAddress(value.address) self.putAddress(value.address)
# Workaround for http://sourceware.org/bugzilla/show_bug.cgi?id=13380 # Workaround for http://sourceware.org/bugzilla/show_bug.cgi?id=13380
if type.code == ArrayCode: if type.code == ArrayCode:
value = parseAndEvaluate("{%s}%s" % (type, value.address)) value = parseAndEvaluate("{%s}%s" % (type, value.address))
else: else:
value = value.cast(type.strip_typedefs()) try:
value = value.cast(type)
self.putItem(value)
except:
self.putValue("<optimized out typedef>")
self.putType(typeName)
self.putNumChild(0)
return
self.putItem(value) self.putItem(value)
self.putBetterType(typeName) self.putBetterType(typeName)
return return
...@@ -1484,8 +1495,16 @@ class Dumper: ...@@ -1484,8 +1495,16 @@ class Dumper:
if type.code == PointerCode: if type.code == PointerCode:
#warn("POINTER: %s" % value) #warn("POINTER: %s" % value)
if not isAccessible(value): # This could still be stored in a register and
self.currentValue = None # potentially dereferencable.
if value.is_optimized_out:
self.putValue("<optimized out>")
try:
value.dereference()
except:
self.putValue("<optimized out>")
self.putType(typeName)
self.putNumChild(0) self.putNumChild(0)
return return
...@@ -1625,7 +1644,8 @@ class Dumper: ...@@ -1625,7 +1644,8 @@ class Dumper:
if self.useDynamicType: if self.useDynamicType:
dtypeName = dynamicTypeName(value) dtypeName = dynamicTypeName(value.cast(type))
#dtypeName = str(lookupType(dtypeName)) # Strip const etc. FIXME
else: else:
dtypeName = typeName dtypeName = typeName
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment