Python GDB pretty printer:当父结构已知数组大小时打印数组 我在C++中有一个类似这样的结构: 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>

Python GDB pretty printer:当父结构已知数组大小时打印数组 我在C++中有一个类似这样的结构: 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>,python,debugging,gdb,pretty-print,gdb-python,Python,Debugging,Gdb,Pretty Print,Gdb Python,这些是框架的一部分,还有其他几个成员、助手等等,但这些都是重要的部分。我想在Python GDB pretty打印机中演示如下内容: struct HeapBlock { char* data; } struct DataBlock { int size; HeapBlock hb; } NAME TYPE VALUE DataBlock: DataBlock "Size 20

这些是框架的一部分,还有其他几个成员、助手等等,但这些都是重要的部分。我想在Python GDB pretty打印机中演示如下内容:

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>
名称类型值
数据块:数据块“大小2000@0x445343”
|--->国际2000码
|--->数据堆块{…}
|--->[0]字符0x34
|--->[1] 字符0x45
....
到目前为止,我未能将HeapBlock显示为单独的子对象。我已成功滥用迭代器生成:

NAME                  TYPE             VALUE
DataBlock:            DataBlock      
  |--->size           int              2000
  |--->[0]            char             0x34
  |--->[1]            char             0x45
   ....
   <more values>
名称类型值
数据块:数据块
|--->国际2000码
|--->[0]字符0x34
|--->[1] 字符0x45
....
这是通过从迭代器返回的第一个结果中返回
db[“size”]
来完成的,迭代器由
DataBlockPrinter
children()
方法返回,然后从
db[“hb”][“data”]
返回下一个
size
结果

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


size
字段作为
DataBlock
的一部分在这里打印时,是否可以将其打印到
HeapBlock
漂亮的打印机中?

不幸的是,没有内置的方法可以做到这一点。我相信gdb bugzilla中有一个漏洞

也许可以通过hack来实现:在
数据块
打印机中,将
堆块
的地址和大小记录在哈希表中。然后,
HeapBlock
打印机可以查找此信息。当然,接下来的问题是决定如何使缓存失效。一开始我想不出一个好办法:-(但不使其失效也没关系。当
数据块
打印机被破坏时,您可以尝试使其失效;gdb不能保证这会起作用,但在实践中可能还可以。

我找到了另一种方法

#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' 
似乎是和的组合?