Красивая печать GDB: возвращает строку из итератора children(), но отображается как char[]

У меня есть удобный класс, который я использую, чтобы позволить мне легко добавлять набор функций "суммирования" к красивому принтеру 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() и заставить ее отображаться в виде строки?


person Inductiveload    schedule 20.10.2014    source источник
comment
Здесь недостаточно информации, чтобы понять, в чем проблема. В частности, какие типы вы пытались вернуть? Я бы подумал, что строка Python или gdb.LazyString будут работать нормально. Также стоит проверить трафик MI. Это может быть ошибка в графическом интерфейсе или даже ошибка в varobj.   -  person Tom Tromey    schedule 09.03.2015
comment
Любое решение этой проблемы?   -  person user3324131    schedule 02.07.2021


Ответы (1)


Хорошо, очевидно, это может быть ошибка, связанная с тем, как GDB/MI взаимодействует с симпатичными принтерами, созданными Bugzilla здесь: https://sourceware.org/bugzilla/show_bug.cgi?id=18282

person David    schedule 20.04.2015