在gdb中打印时如何访问阵列?

在gdb中打印时如何访问阵列?,gdb,pretty-print,Gdb,Pretty Print,我可以使用ptr.dereference获取值,但是我不知道如何增加指针以获取下一个值。假设我使用的是16位有符号数组。如何获得前5个值 class MyArrayPrinter: "Print a MyArray" def __init__ (self, val): self.val = val def to_string (self): return "Array of" def c

我可以使用ptr.dereference获取值,但是我不知道如何增加指针以获取下一个值。假设我使用的是16位有符号数组。如何获得前5个值

class MyArrayPrinter:
    "Print a MyArray"

    def __init__ (self, val):
        self.val = val

    def to_string (self):
        return "Array of"

    def children(self):
        ptr = self.val['array']
        #yield ('0', ptr.address[1].dereference())
        yield ('5', 47)

    def display_hint (self):
        return 'array'

对于这个简单的数组类,请参见:

模板
结构MyArray
{
int pos;
T阵列[10];
MyArray():pos(0){}
无效推力(T val){
如果(位置>=10)
返回;
数组[pos++]=val;
}
};
我会像这样实现漂亮的打印机:

class MyArrayPrinter:
    "Print a MyArray"

    class _iterator:
        def __init__ (self, start, finish):
            self.item = start
            self.finish = finish
            self.count = 0

        def __iter__ (self):
            return self

        def __next__ (self):
            count = self.count
            self.count = self.count + 1
            if self.item == self.finish:
                raise StopIteration
            elt = self.item.dereference()
            self.item = self.item + 1
            return ('[%d]' % count, elt)

        def next (self):
            return self.__next__()

    def __init__ (self, val):
        self.val = val

    def children (self):
        start = self.val['array'][0].address
        return self._iterator(start, start + self.val['pos'])

    def to_string (self):
        len = self.val['pos']
        return '%s of length %d' % (self.val.type, len)

    def display_hint (self):
        return 'array'

pp = gdb.printing.RegexpCollectionPrettyPrinter("mine")
pp.add_printer('MyArray', '^MyArray<.*>$', MyArrayPrinter)
gdb.printing.register_pretty_printer(gdb.current_objfile(), pp)
(gdb) p arr
$1 = MyArray<MyString> of length 2 = {"My test string", "has two"}
(gdb) p arr2
$2 = MyArray<MoreComplex*> of length 1 = {0x22fe00}
MyArrayPrinter类:
“打印MyArray”
类_迭代器:
定义初始(自我、开始、完成):
self.item=start
self.finish=完成
self.count=0
定义(自我):
回归自我
定义下一个(自我):
计数=自我计数
self.count=self.count+1
如果self.item==self.finish:
提出停止迭代
elt=self.item.dereference()
self.item=self.item+1
返回('[%d]'%count,elt)
def next(自我):
返回自我。下一个
定义初始值(self,val):
self.val=val
def儿童(自我):
start=self.val['array'][0]。地址
返回self.\u迭代器(start,start+self.val['pos'])
def到_字符串(自):
len=self.val['pos']
返回长度为%d的“%s”(self.val.type,len)
def显示提示(自我):
返回“数组”
pp=gdb.printing.RegexpCollectionPrettyPrinter(“我的”)
pp.add_打印机('MyArray','^MyArray$',MyArrayPrinter)
gdb.printing.register\u pretty\u printer(gdb.current\u objfile(),pp)
看起来是这样的:

class MyArrayPrinter:
    "Print a MyArray"

    class _iterator:
        def __init__ (self, start, finish):
            self.item = start
            self.finish = finish
            self.count = 0

        def __iter__ (self):
            return self

        def __next__ (self):
            count = self.count
            self.count = self.count + 1
            if self.item == self.finish:
                raise StopIteration
            elt = self.item.dereference()
            self.item = self.item + 1
            return ('[%d]' % count, elt)

        def next (self):
            return self.__next__()

    def __init__ (self, val):
        self.val = val

    def children (self):
        start = self.val['array'][0].address
        return self._iterator(start, start + self.val['pos'])

    def to_string (self):
        len = self.val['pos']
        return '%s of length %d' % (self.val.type, len)

    def display_hint (self):
        return 'array'

pp = gdb.printing.RegexpCollectionPrettyPrinter("mine")
pp.add_printer('MyArray', '^MyArray<.*>$', MyArrayPrinter)
gdb.printing.register_pretty_printer(gdb.current_objfile(), pp)
(gdb) p arr
$1 = MyArray<MyString> of length 2 = {"My test string", "has two"}
(gdb) p arr2
$2 = MyArray<MoreComplex*> of length 1 = {0x22fe00}
(gdb)p arr
$1=MyArray,长度为2={“我的测试字符串”,“有两个”}
(gdb)p arr2
$2=MyArray,长度为1={0x22fe00}

对于这个简单的数组类,取自您的:

模板
结构MyArray
{
int pos;
T阵列[10];
MyArray():pos(0){}
无效推力(T val){
如果(位置>=10)
返回;
数组[pos++]=val;
}
};
我会像这样实现漂亮的打印机:

class MyArrayPrinter:
    "Print a MyArray"

    class _iterator:
        def __init__ (self, start, finish):
            self.item = start
            self.finish = finish
            self.count = 0

        def __iter__ (self):
            return self

        def __next__ (self):
            count = self.count
            self.count = self.count + 1
            if self.item == self.finish:
                raise StopIteration
            elt = self.item.dereference()
            self.item = self.item + 1
            return ('[%d]' % count, elt)

        def next (self):
            return self.__next__()

    def __init__ (self, val):
        self.val = val

    def children (self):
        start = self.val['array'][0].address
        return self._iterator(start, start + self.val['pos'])

    def to_string (self):
        len = self.val['pos']
        return '%s of length %d' % (self.val.type, len)

    def display_hint (self):
        return 'array'

pp = gdb.printing.RegexpCollectionPrettyPrinter("mine")
pp.add_printer('MyArray', '^MyArray<.*>$', MyArrayPrinter)
gdb.printing.register_pretty_printer(gdb.current_objfile(), pp)
(gdb) p arr
$1 = MyArray<MyString> of length 2 = {"My test string", "has two"}
(gdb) p arr2
$2 = MyArray<MoreComplex*> of length 1 = {0x22fe00}
MyArrayPrinter类:
“打印MyArray”
类_迭代器:
定义初始(自我、开始、完成):
self.item=start
self.finish=完成
self.count=0
定义(自我):
回归自我
定义下一个(自我):
计数=自我计数
self.count=self.count+1
如果self.item==self.finish:
提出停止迭代
elt=self.item.dereference()
self.item=self.item+1
返回('[%d]'%count,elt)
def next(自我):
返回自我。下一个
定义初始值(self,val):
self.val=val
def儿童(自我):
start=self.val['array'][0]。地址
返回self.\u迭代器(start,start+self.val['pos'])
def到_字符串(自):
len=self.val['pos']
返回长度为%d的“%s”(self.val.type,len)
def显示提示(自我):
返回“数组”
pp=gdb.printing.RegexpCollectionPrettyPrinter(“我的”)
pp.add_打印机('MyArray','^MyArray$',MyArrayPrinter)
gdb.printing.register\u pretty\u printer(gdb.current\u objfile(),pp)
看起来是这样的:

class MyArrayPrinter:
    "Print a MyArray"

    class _iterator:
        def __init__ (self, start, finish):
            self.item = start
            self.finish = finish
            self.count = 0

        def __iter__ (self):
            return self

        def __next__ (self):
            count = self.count
            self.count = self.count + 1
            if self.item == self.finish:
                raise StopIteration
            elt = self.item.dereference()
            self.item = self.item + 1
            return ('[%d]' % count, elt)

        def next (self):
            return self.__next__()

    def __init__ (self, val):
        self.val = val

    def children (self):
        start = self.val['array'][0].address
        return self._iterator(start, start + self.val['pos'])

    def to_string (self):
        len = self.val['pos']
        return '%s of length %d' % (self.val.type, len)

    def display_hint (self):
        return 'array'

pp = gdb.printing.RegexpCollectionPrettyPrinter("mine")
pp.add_printer('MyArray', '^MyArray<.*>$', MyArrayPrinter)
gdb.printing.register_pretty_printer(gdb.current_objfile(), pp)
(gdb) p arr
$1 = MyArray<MyString> of length 2 = {"My test string", "has two"}
(gdb) p arr2
$2 = MyArray<MoreComplex*> of length 1 = {0x22fe00}
(gdb)p arr
$1=MyArray,长度为2={“我的测试字符串”,“有两个”}
(gdb)p arr2
$2=MyArray,长度为1={0x22fe00}

这与您的另一个问题中的
结构MyArray
相同吗?值
'5'
47
应该做什么?@ssbssa:是的,与其他值相同。这些值没有任何意义,我将其用作测试,因此数组不会为空。这与您的另一个问题中的
struct MyArray
相同吗?值
'5'
47
应该做什么?@ssbssa:是的,与其他值相同。这些值没有任何意义,我使用它作为测试,因此数组不是空的。只是想知道,你这样做有什么原因吗
str(count)
的工作原理似乎是一样的,我想知道您是否注意到其中的差异,或者一种方法是否更合适。老实说,我也不确定,但这也是如何在中完成的,所以我只是用同样的方法。tyvm。只是想知道,你这样做有什么原因吗
str(count)
的工作原理似乎是一样的,我想知道你是否注意到了一个不同点,或者一种方法是否更合适。老实说,我也不确定,但这也是如何在中完成的,所以我只是用同样的方法。