2014-10-20 4 views
2

GDB에 "summariser"함수를 쉽게 추가 할 수있게 해주는 편리한 클래스가 있습니다. 예쁜 프린터 (예 : Rect 클래스는 파이썬에 의해 계산 된 [Area] 필드를 가질 수 있습니다). 그러면 기존의 모든 하위 항목도 인쇄되므로 모든 것을 한 번에 볼 수 있습니다.GDB pretty-printing : children()의 iterator에서 문자열을 반환하지만 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 

를 얻을 수 있도록 문자열, 그것은이 오는 문자열 becuase 아마도이며, 배열로 표시 끝

에서
name, retVal = self.summaries[self.count](self.obj) 

SummaryAndFieldIterator의에 의해 반환 될 때 충분히 "힘줄"gdb.Value 객체를 생성하지 않습니다방법. display_hint() 메서드를 MyObjectPrinter으로 조정해도 아무런 효과가없는 것 같지만 (이 것은 자식이 아니기 때문에 개체가 아니라고 생각합니다.)

누구나 children() 이터레이터에서 문자열을 반환하고 문자열로 표시하는 방법을 알고 계십니까?

+0

. 특히 어떤 유형의 반품을 시도 했습니까? 나는 파이썬 문자열이나'gdb.LazyString'이 잘 동작 할 것이라고 생각했을 것이다. 또한 MI 트래픽을 검사 할 가치가 있습니다. 이것은 GUI의 버그 일 수도 있고, 아마도 "varobj"의 버그 일 수도 있습니다. –

답변