[英]GDB pretty-printer: printing an array when the size is known by the parent struct
我在C ++中有一個類似這樣的結構:
struct HeapBlock {
char* data;
}
struct DataBlock {
int size;
HeapBlock hb;
}
這些是框架的一部分,並具有其他幾個成員,助手等,但是這些是重要的部分。 我想在Python GDB漂亮打印機中顯示以下內容:
NAME TYPE VALUE
DataBlock: DataBlock "Size 2000 @ 0x445343"
|--->size int 2000
|--->data HeapBlock {...}
|--->[0] char 0x34
|--->[1] char 0x45
....
<more values>
到目前為止,我未能將HeapBlock顯示為單獨的孩子。 我已經成功地濫用了迭代器來產生:
NAME TYPE VALUE
DataBlock: DataBlock
|--->size int 2000
|--->[0] char 0x34
|--->[1] char 0x45
....
<more values>
這是通過從DataBlockPrinter
的children()
方法返回的迭代器的第一個結果中返回db["size"]
,然后從db["hb"]["data"]
下一個size
結果來完成的。
我也嘗試過為HeapBlocks
使用單獨的打印機,但是問題是HeapBlock
不知道它有多大:它存儲在父級( DataBlock
)中,所以HeapBlock
打印機也不知道何時停止。迭代。
是否有可能獲得size
領域的HeapBlock
漂亮的打印機時,打印出來的部分DataBlock
在這里?
我找到了另一種方式
#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'
不幸的是,沒有內置的方法可以做到這一點。 我相信gdb bugzilla中存在有關此問題的錯誤。
可能會發生黑客攻擊:在DataBlock
打印機中,在哈希表中記錄HeapBlock
的地址和大小。 然后, HeapBlock
打印機可以查找此內容。 當然,問題就成為決定如何使緩存無效的問題之一。 副手,我想不出一個好方法:-(但是簡單地不使它無效也可以。您可以在銷毀DataBlock
打印機時嘗試使之無效; gdb不保證這會起作用,但是在其中可以實踐。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.