在gdb中进行漂亮打印时,如何访问数组?

问题描述

我可以使用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'

解决方法

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

template<class T>
struct MyArray
{
    int pos;
    T array[10];
    MyArray() : pos(0) {}
    void push(T val) {
        if (pos >= 10)
            return;
        array[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}