簡體   English   中英

GDB pretty-printer:在父結構知道大小的情況下打印數組

[英]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>

這是通過從DataBlockPrinterchildren()方法返回的迭代器的第一個結果中返回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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM