GDB漂亮打印:从children()的迭代器返回字符串,但显示为char []
问题描述:
我有一个方便的类,我可以使用它轻松地将一组“summariser”函数添加到GDB漂亮的打印机(例如,Rect
类可能有一个由Python计算的字段)。然后它会打印所有现有的孩子,以便一次查看所有内容。GDB漂亮打印:从children()的迭代器返回字符串,但显示为char []
class SummaryAndFieldIterator:
"""
Iterator to first go through a list of summariser functions,
then display all the fields in the object in order
"""
def __init__ (self, obj, summaries):
self.count = 0
self.obj = obj;
self.summaries = summaries;
self.keys = sorted(obj.type.iterkeys())
def __iter__(self):
return self
def __next__(self):
if (self.count >= len(self.keys) + len(self.summaries)):
raise StopIteration
elif self.count < len(self.summaries):
name, retVal = self.summaries[self.count](self.obj)
# FIXME: this doesn't seem to work when a string is returned
# in retVal?
result = "[%s]" % name, retVal
else:
field = self.count - len(self.summaries)
result = self.keys[field], self.obj[self.keys[field]]
self.count += 1
return result
next = __next__
class MyObjectPrinter:
def __init__(self, val):
self.val = val
def get_int(self):
return "meaning", 42
def get_string(self):
return "hoopiness", "Forty-two"
def children(self):
return SummaryAndFieldIterator(self.val, [self.get_string])
这都非常好,它会返回数值的summarisers,但对于字符串,它最终显示为一个数组,让我得到
NAME VALUE
myobj {..}
|-->[meaning] 42
|-->[hoopiness]
|-->[0] 'F'
|-->[1] 'o'
.....
|-->real_field 34234
这大概是监守自带的字符串从
name, retVal = self.summaries[self.count](self.obj)
当由SummaryAndFieldIterator
的返回不产生足够“粘性” gdb.Value
对象方法。调整display_hint()
方法MyObjectPrinter
似乎没有任何效果(但我怀疑它会,因为这是孩子,而不是对象)。
任何人都知道如何从children()
迭代器返回一个字符串,并让它显示为一个字符串?
答
好了,显然,这可能与该GDB/MI与漂亮的打印机通信方式的错误,Bugzilla的在这里创造:https://sourceware.org/bugzilla/show_bug.cgi?id=18282
这里是不是真的有足够的信息来知道问题是什么。特别是,你尝试返回什么类型?我会认为Python字符串或'gdb.LazyString'可以正常工作。这也是值得检查MI交通。它可能是GUI中的一个错误,甚至可能是'varobj'中的一个错误。 – 2015-03-09 14:10:09