forked from qt-creator/qt-creator
Debugger: Remove workaround for GDB < 7.2 missing frame.block
This practically means that the >= 7.2 requirement is now a hard requirement. Change-Id: I6c3abbc625443ded182d2da101e04d96e3bed26d Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
This commit is contained in:
@@ -154,154 +154,84 @@ try:
|
|||||||
warn("FRAME NOT ACCESSIBLE FOR UNKNOWN REASONS")
|
warn("FRAME NOT ACCESSIBLE FOR UNKNOWN REASONS")
|
||||||
return []
|
return []
|
||||||
|
|
||||||
# New in 7.2
|
try:
|
||||||
hasBlock = 'block' in __builtin__.dir(frame)
|
block = frame.block()
|
||||||
|
#warn("BLOCK: %s " % block)
|
||||||
|
except RuntimeError, error:
|
||||||
|
warn("BLOCK IN FRAME NOT ACCESSIBLE: %s" % error)
|
||||||
|
return items
|
||||||
|
except:
|
||||||
|
warn("BLOCK NOT ACCESSIBLE FOR UNKNOWN REASONS")
|
||||||
|
return items
|
||||||
|
|
||||||
items = []
|
items = []
|
||||||
#warn("HAS BLOCK: %s" % hasBlock)
|
shadowed = {}
|
||||||
if hasBlock:
|
while True:
|
||||||
#warn("IS GOOD: %s " % varList)
|
if block is None:
|
||||||
try:
|
warn("UNEXPECTED 'None' BLOCK")
|
||||||
block = frame.block()
|
break
|
||||||
#warn("BLOCK: %s " % block)
|
for symbol in block:
|
||||||
except RuntimeError, error:
|
name = symbol.print_name
|
||||||
warn("BLOCK IN FRAME NOT ACCESSIBLE: %s" % error)
|
|
||||||
return items
|
|
||||||
except:
|
|
||||||
warn("BLOCK NOT ACCESSIBLE FOR UNKNOWN REASONS")
|
|
||||||
return items
|
|
||||||
|
|
||||||
shadowed = {}
|
if name == "__in_chrg":
|
||||||
while True:
|
|
||||||
if block is None:
|
|
||||||
warn("UNEXPECTED 'None' BLOCK")
|
|
||||||
break
|
|
||||||
for symbol in block:
|
|
||||||
name = symbol.print_name
|
|
||||||
|
|
||||||
if name == "__in_chrg":
|
|
||||||
continue
|
|
||||||
|
|
||||||
# "NotImplementedError: Symbol type not yet supported in
|
|
||||||
# Python scripts."
|
|
||||||
#warn("SYMBOL %s (%s): " % (symbol, name))
|
|
||||||
if name in shadowed:
|
|
||||||
level = shadowed[name]
|
|
||||||
name1 = "%s@%s" % (name, level)
|
|
||||||
shadowed[name] = level + 1
|
|
||||||
else:
|
|
||||||
name1 = name
|
|
||||||
shadowed[name] = 1
|
|
||||||
#warn("SYMBOL %s (%s, %s)): " % (symbol, name, symbol.name))
|
|
||||||
item = LocalItem()
|
|
||||||
item.iname = "local." + name1
|
|
||||||
item.name = name1
|
|
||||||
try:
|
|
||||||
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:
|
|
||||||
pass
|
|
||||||
|
|
||||||
try:
|
|
||||||
item.value = frame.read_var(name)
|
|
||||||
#warn("READ 2: %s" % item.value)
|
|
||||||
if not item.value.is_optimized_out:
|
|
||||||
#warn("ITEM 2: %s" % item.value)
|
|
||||||
items.append(item)
|
|
||||||
continue
|
|
||||||
except:
|
|
||||||
# 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
|
|
||||||
# FIXME: check whether this is guaranteed.
|
|
||||||
if not block.function is None:
|
|
||||||
break
|
|
||||||
|
|
||||||
block = block.superblock
|
|
||||||
else:
|
|
||||||
# Assuming gdb 7.0 release or 6.8-symbianelf.
|
|
||||||
filename = createTempFile()
|
|
||||||
#warn("VARLIST: %s " % varList)
|
|
||||||
#warn("FILENAME: %s " % filename)
|
|
||||||
gdb.execute("set logging off")
|
|
||||||
# gdb.execute("set logging redirect off")
|
|
||||||
gdb.execute("set logging file %s" % filename)
|
|
||||||
# gdb.execute("set logging redirect on")
|
|
||||||
gdb.execute("set logging on")
|
|
||||||
try:
|
|
||||||
gdb.execute("info args")
|
|
||||||
# We cannot use "info locals" as at least 6.8-symbianelf
|
|
||||||
# aborts as soon as we hit unreadable memory.
|
|
||||||
# gdb.execute("interpreter mi '-stack-list-locals 0'")
|
|
||||||
# results in &"Recursive internal problem.\n", so we have
|
|
||||||
# the frontend pass us the list of locals.
|
|
||||||
|
|
||||||
# There are two cases, either varList is empty, so we have
|
|
||||||
# to fetch the list here, or it is not empty with the
|
|
||||||
# first entry being a dummy.
|
|
||||||
if len(varList) == 0:
|
|
||||||
gdb.execute("info locals")
|
|
||||||
else:
|
|
||||||
varList = varList[1:]
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
gdb.execute("set logging off")
|
|
||||||
# gdb.execute("set logging redirect off")
|
|
||||||
|
|
||||||
try:
|
|
||||||
temp = open(filename, "r")
|
|
||||||
for line in temp:
|
|
||||||
if len(line) == 0 or line.startswith(" "):
|
|
||||||
continue
|
|
||||||
# The function parameters
|
|
||||||
pos = line.find(" = ")
|
|
||||||
if pos < 0:
|
|
||||||
continue
|
|
||||||
varList.append(line[0:pos])
|
|
||||||
temp.close()
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
removeTempFile(filename)
|
|
||||||
#warn("VARLIST: %s " % varList)
|
|
||||||
for name in varList:
|
|
||||||
#warn("NAME %s " % name)
|
|
||||||
item = LocalItem()
|
|
||||||
item.iname = "local." + name
|
|
||||||
item.name = name
|
|
||||||
try:
|
|
||||||
item.value = frame.read_var(name) # this is a gdb value
|
|
||||||
except RuntimeError:
|
|
||||||
pass
|
|
||||||
#continue
|
|
||||||
except:
|
|
||||||
# Something breaking the list, like intermediate gdb warnings
|
|
||||||
# like 'Warning: can't find linker symbol for virtual table for
|
|
||||||
# `std::less<char const*>' value\n\nwarning: found
|
|
||||||
# `myns::QHashData::shared_null' instead [...]
|
|
||||||
# that break subsequent parsing. Chicken out and take the
|
|
||||||
# next "usable" line.
|
|
||||||
continue
|
continue
|
||||||
items.append(item)
|
|
||||||
|
# "NotImplementedError: Symbol type not yet supported in
|
||||||
|
# Python scripts."
|
||||||
|
#warn("SYMBOL %s (%s): " % (symbol, name))
|
||||||
|
if name in shadowed:
|
||||||
|
level = shadowed[name]
|
||||||
|
name1 = "%s@%s" % (name, level)
|
||||||
|
shadowed[name] = level + 1
|
||||||
|
else:
|
||||||
|
name1 = name
|
||||||
|
shadowed[name] = 1
|
||||||
|
#warn("SYMBOL %s (%s, %s)): " % (symbol, name, symbol.name))
|
||||||
|
item = LocalItem()
|
||||||
|
item.iname = "local." + name1
|
||||||
|
item.name = name1
|
||||||
|
try:
|
||||||
|
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:
|
||||||
|
pass
|
||||||
|
|
||||||
|
try:
|
||||||
|
item.value = frame.read_var(name)
|
||||||
|
#warn("READ 2: %s" % item.value)
|
||||||
|
if not item.value.is_optimized_out:
|
||||||
|
#warn("ITEM 2: %s" % item.value)
|
||||||
|
items.append(item)
|
||||||
|
continue
|
||||||
|
except:
|
||||||
|
# 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
|
||||||
|
# FIXME: check whether this is guaranteed.
|
||||||
|
if not block.function is None:
|
||||||
|
break
|
||||||
|
|
||||||
|
block = block.superblock
|
||||||
|
|
||||||
return items
|
return items
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user