2014-10-20 3 views
1

이 같은 ++ 뭔가 C에서 구조체를 가지고 :GDB 꽤 - 프린터 : 크기가 부모 구조체에 의해 알려진 경우 배열을 인쇄

struct HeapBlock { 
    char* data; 
} 

struct DataBlock { 
    int size; 
    HeapBlock hb; 
} 

이이 프레임 워크의 일부이며 여러 가지 다른 회원이, 헬퍼 등등 그러나 이들은 중요한 부분입니다.

NAME     TYPE    VALUE 
DataBlock:   DataBlock  "Size 2000 @ 0x445343" 
    |--->size   int    2000 
    |--->data   HeapBlock  {...} 
     |--->[0]  char   0x34 
     |--->[1]  char   0x45 
     .... 
     <more values> 

지금까지, 나는 HeapBlock을 받고에서 실패했습니다 별도의 자식으로 표시 할 :이 같은 파이썬 GDB 꽤-프린터 뭔가이를 보여 드리고자합니다. 나는 성공적으로 생산하는 반복자를 학대 한 :

NAME     TYPE    VALUE 
DataBlock:   DataBlock  
    |--->size   int    2000 
    |--->[0]   char    0x34 
    |--->[1]   char    0x45 
    .... 
    <more values> 

이 다음 size 결과를 db["hb"]["data"]에서 다음 DataBlockPrinterchildren() 방법에 의해 반환 된 반복자에서 첫 번째 결과에 db["size"]를 반환하고,에 의해 수행되었다.

는 또한 HeapBlocks에 대해 별도의 프린터를 사용하는 것을 시도했다, 그러나 문제는 HeapBlock이 얼마나 큰 아무 생각이없는 것이있다 : 즉 부모 ( DataBlock)에 저장되어 있기 때문에 HeapBlock 프린터도하지 않습니다 iterating을 멈출 때를 알아라.

그것은 여기 DataBlock의 일환으로 인쇄 할 때 HeapBlock 꽤 프린터에 size 필드를 얻을 수 있습니까?

답변

0

불행히도이 작업을 수행 할 수있는 기본 제공 방법이 없습니다. 나는 gdb bugzilla에 버그가 있다는 것을 믿습니다.

해킹을 사용하여 수행 할 수 있습니다. DataBlock 프린터에서 HeapBlock의 주소와 크기를 해시 테이블에 기록하십시오. 그런 다음 HeapBlock 프린터가이 문제를 조사 할 수 있습니다. 물론이 문제는 캐시를 무효화하는 방법을 결정하는 하나가됩니다. Offhand 내가 좋은 방법을 생각할 수 없다 :-(하지만 어쩌면 그것을 무효로하지 않는 것이 좋습니다. DataBlock 프린터가 파괴되면 무효화를 시도 할 수도 있지만 gdb는 이것이 작동한다고 보장하지는 않지만 괜찮습니다. 연습.

+0

가의 조합처럼 보인다 타 방법을 발견 https://sourceware.org/bugzilla/show_bug.cgi?id=12806 및 https://sourceware.org/bugzilla/ show_bug.cgi? id = 16436? – Inductiveload

1

내가

#convert to vector 
class DataBlock: 
    def iter(self): 
    p=self.v['p'] 
    emtp=p.type.target().unqualified().strip_typedefs() 
    pv=emtp.vector(self.cnt-1).pointer()#convert to vector,the actual type is char (*) __attribute__ (vector_size(self.cnt))) 
    yield('p',p.cast(pv)) 
#We register this type 
def regCls(v): 
    if str(v.type).find(") __attribute__ ((vector_size")>0: 
     return _py_vector(v) 
def regMyPP():gdb.pretty_printers.append(regCls) 
#Then parse this type out 
class _py_vector: 
    def __init__(self,v):self.v=v 
    def tp(self): 
    s=str(self.v.type) 
    return gdb.lookup_type(s[:s.find('(')-1]).pointer()#eg.char 
    def sz(self): 
    s=str(self.v.type) 
    st=s.find('vector_size(')+12 
    ed=s.find(')',st) 
    return int(s[st:ed])#Get it's size 
    def to_string(self): return self.v.cast(self.tp()).lazy_string(length=self.sz()) 
    def display_hint(self): return 'string'