У меня есть удобный класс, который я использую, чтобы позволить мне легко добавлять набор функций "суммирования" к красивому принтеру GDB (например, класс Rect
может иметь поле [Area
], вычисляемое Python). затем он также печатает всех существующих дочерних элементов, так что вы можете видеть все сразу.
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])
Это очень хорошо работает для сумматоров, которые возвращают числовые значения, но для строк они в конечном итоге отображаются в виде массива, так что я получаю
NAME VALUE
myobj {..}
|-->[meaning] 42
|-->[hoopiness]
|-->[0] 'F'
|-->[1] 'o'
.....
|-->real_field 34234
Предположительно, это связано с тем, что строка исходит из
name, retVal = self.summaries[self.count](self.obj)
не генерирует достаточно "строчный" объект gdb.Value
, когда он возвращается методом __next__
SummaryAndFieldIterator
. Настройка метода display_hint()
для MyObjectPrinter
, похоже, не имеет никакого эффекта (но я сомневаюсь, что это будет, поскольку это дочерний элемент, а не объект).
Кто-нибудь знает, как вернуть строку из итератора children()
и заставить ее отображаться в виде строки?
gdb.LazyString
будут работать нормально. Также стоит проверить трафик MI. Это может быть ошибка в графическом интерфейсе или даже ошибка вvarobj
. - person Tom Tromey   schedule 09.03.2015