1

假设我有一个简单的struct

struct S {
    int index;        
    const std::vector<int>& vec;
};

我想为 GDB 编写一个漂亮的打印机,它会显示vec[index]类型为 的对象S

这就是我现在的做法:

class SPrinter:
    def __init__(self, name, val):
        self.val = val

    def to_string(self):
        i = int(self.val['index'])
        ptr = self.val['vec']['_M_impl']['_M_start'] + i
        return str(ptr.dereference())

有没有更简单的方法来访问给定的元素std::vector?是否可以调用operator[](在 GDB 中我可以做得到p s.vec[0]我想要的)?我希望我的打印机独立于std::vector.

4

1 回答 1

2

阅读此答案后,我想出了以下解决方案:

def get_vector_element(vec, index):
    type = gdb.types.get_basic_type(vec.type)
    return gdb.parse_and_eval('(*(%s*)(%s))[%d]' % (type, vec.address, index))

class SPrinter(object):
    def __init__(self, name, val):
        self.val = val

    def to_string(self):
        return get_vector_element(self.val['vec'], int(self.val['index']))
于 2018-12-22T10:59:35.410 回答