Отображение определенного элемента std::vector в красивом принтере GDB

Предположим, у меня есть простой 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.


person Evg    schedule 22.12.2018    source источник


Ответы (1)


Прочитав этот ответ, я пришел к следующему решению:

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']))
person Evg    schedule 22.12.2018