2

我在 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>

这是通过从's方法db["size"]返回的迭代器返回第一个结果,然后从下一个结果返回来完成的。DataBlockPrinterchildren()db["hb"]["data"]size

我也尝试为 使用单独的打印机HeapBlocks,但问题是 aHeapBlock不知道它有多大:它存储在父级 ( DataBlock) 中,因此HeapBlock打印机也不知道何时停止迭代。

当它作为这里的一部分打印时,是否可以将size字段发送到漂亮的打印机?HeapBlockDataBlock

4

2 回答 2

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' 
于 2017-08-21T03:50:30.943 回答
0

不幸的是,没有内置的方法可以做到这一点。我相信在 gdb bugzilla 中有一个关于它的错误。

可以通过 hack 来做到这一点:在打印机中,在哈希表中DataBlock记录地址和大小。HeapBlock然后HeapBlock打印机可以查到这个。当然,问题变成决定如何使缓存无效的问题之一。临时我想不出一个好方法:-(但也许简单地不使其无效是可以的。您可以在DataBlock打印机被销毁时尝试使无效;gdb 不保证这会起作用,但在实践中可能没问题.

于 2015-03-09T15:31:53.897 回答