在 GDB 漂亮打印机中显示特定 std::vector 的元素
Display a particular std::vector's element in GDB pretty printer
假设我有一个简单的 struct
:
struct S {
int index;
const std::vector<int>& vec;
};
我想为 GDB 编写一个漂亮的打印机,它可以为 S
.
类型的对象显示 vec[index]
我现在是这样做的:
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
.
的特定实现
阅读this answer后,我想出了以下解决方案:
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']))
假设我有一个简单的 struct
:
struct S {
int index;
const std::vector<int>& vec;
};
我想为 GDB 编写一个漂亮的打印机,它可以为 S
.
vec[index]
我现在是这样做的:
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
.
阅读this answer后,我想出了以下解决方案:
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']))