gpt4 book ai didi

python - GDB pretty-print : printing an array when the size is known by the parent struct

转载 作者:太空宇宙 更新时间:2023-11-03 18:08:09 25 4
gpt4 key购买 nike

我有一个 C++ 结构,如下所示:

struct HeapBlock {
char* data;
}

struct DataBlock {
int size;
HeapBlock hb;
}

它们是框架的一部分,还有其他几个成员、助手等,但这些是重要的部分。我想在 Python GDB pretty-print 中显示它,如下所示:

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字段作为DataBlock的一部分在这里打印时,是否可以将size字段获取到HeapBlock pretty-print ?

最佳答案

我找到了另一种方法

#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'

关于python - GDB pretty-print : printing an array when the size is known by the parent struct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26471651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com