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()
이터레이터에서 문자열을 반환하고 문자열로 표시하는 방법을 알고 계십니까?
. 특히 어떤 유형의 반품을 시도 했습니까? 나는 파이썬 문자열이나'gdb.LazyString'이 잘 동작 할 것이라고 생각했을 것이다. 또한 MI 트래픽을 검사 할 가치가 있습니다. 이것은 GUI의 버그 일 수도 있고, 아마도 "varobj"의 버그 일 수도 있습니다. –