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()迭代器返回一个字符串,并让它显示为一个字符串?

+0

这里是不是真的有足够的信息来知道问题是什么。特别是,你尝试返回什么类型?我会认为Python字符串或'gdb.LazyString'可以正常工作。这也是值得检查MI交通。它可能是GUI中的一个错误,甚至可能是'varobj'中的一个错误。 – 2015-03-09 14:10:09

好了,显然,这可能与该GDB/MI与漂亮的打印机通信方式的错误,Bugzilla的在这里创造:https://sourceware.org/bugzilla/show_bug.cgi?id=18282