2017-10-02 4 views
0

나는 다음 인 내 자신의 객체에 대한 LLDB 데이터 포맷터를 작성하려합니다 :LLDB 데이터 포매터 및 C 배열

여기
template <typename T, int n> 
class StaticArray { 
    T data_[n]; 
} 

내 합성 데이터 포맷 지금까지 모습입니다 :

class StaticArrayProvider: 
    def __init__(self, valobj, internal_dict): 
     self.valobj = valobj 
     self.data = self.valobj.GetChildMemberWithName('data_').GetChildAtIndex(0) 
     self.data_type = self.data.GetType() 
     self.type_size = self.data_type.GetByteSize() 
     self.size = # ??? 

    def num_children(self): 
     return self.size 

    def get_child_index(self, name): 
     try: 
      return int(name.lstrip('[').rstrip(']')) 
     except: 
      return -1 

    def get_child_at_index(self, index): 
     if index < 0: 
      return None 
     if index >= self.num_children(): 
      return None 
     try: 
      offset = index * self.type_size 
      return # ??? 
     except: 
      return None 

공백을 채우기 위해해야 ​​할 일을 모른다 (# ???). 어떤 해결책이 있습니까?

답변

1

lldb 값 시스템에서 GetNumChildren은 정적으로 크기가 지정된 배열의 요소 수를 반환하고 GetChildAtIndex은 해당 배열 요소를 반입합니다. data_은 정적으로 크기가 지정된 배열이기 때문에 데이터 형식 지정 도구는 자식을 제공 할 때 data_을 전달할 수 있습니다. 나는. 당신은 할 수 있습니다 :

self.data = self.valobj.GetChildMemberWithName('data_') 

다음 num_children 그냥 self.data.GetNumChildren()get_child_at_index 반환 self.data.GetChildAtIndex()을 반환

.

lldb에서 알아낼 수없는 경우에만 오프셋 및 크기를 계산하면됩니다 (예 : 동적 크기의 배열이나 입력으로 포인터로 배열을 처리하는 경우)