double var1, var2;
std::vector<double *> x;
var1 = 1;
var2 = 2;
x.push_back(&var1);
x.push_back(&var2);
当我在gdb中调试此代码并尝试print x [0]或* x [0]时,我得到:找不到operator []。 现在如果我在push_back之后包含这一行:
x[0] = &var1;
我可以访问gdb中的任何特定元素。其他成员也会发生同样的事情,例如front(),at()等。我的理解是编译器/链接器只包含源代码中存在的成员函数,而那些是我可以在gdb中使用的成员函数。有没有办法包含std :: vector的每个成员函数,以便我可以在gdb中访问它们?
答案 0 :(得分:26)
我的理解是编译器/链接器只包含源代码中存在的成员函数,而那些是我可以在gdb中使用的成员函数。
您的理解不正确/不完整。
std::vector
是一个模板类。如果没有显式实例化,编译器需要实例化仅调用的方法(通常是源中存在的方法的子集)。
有没有办法包含std :: vector的每个成员函数,以便我可以在gdb中访问它们?
对于给定类型T
,您应该能够通过请求它来明确地为T
实例化整个向量,例如:
template class std::vector<double>;
答案 1 :(得分:9)
答案 2 :(得分:3)
或者,你可以使用下面的GDB扩展,这将扩展到GNU libstdc ++的std::vector
字段,因此无论operator[]
是否被实例化都可以工作。
加载:
(gdb) guile (load "the-file.scm")
这将创建一个新的vref
命令:
(gdb) vref my_vector 0
代码(需要使用Guile支持构建GDB):
(use-modules (gdb)
(ice-9 match))
(define (std::vector-ref vector index)
(let* ((impl (value-field vector "_M_impl"))
(start (value-field impl "_M_start")))
(value-subscript start index)))
(define %vector-ref-command
(make-command "vref"
#:command-class COMMAND_OBSCURE
#:doc "Access an element of an std::vector."
#:invoke
(lambda (self args tty?)
(match (string-tokenize args)
((variable index)
(let* ((value (std::vector-ref (parse-and-eval variable)
(string->number index)))
(index (history-append! value)))
(format #t "$~a = ~a~%"
index (value-print value)))))
#t)))
(register-command! %vector-ref-command)
答案 3 :(得分:0)
.at()、. begin()函数出于某种原因对我有用。可能是因为我设置了-g标志。