gdb无法找到operator []

时间:2014-06-09 22:32:15

标签: c++ vector gdb

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中访问它们?

4 个答案:

答案 0 :(得分:26)

  

我的理解是编译器/链接器只包含源代码中存在的成员函数,而那些是我可以在gdb中使用的成员函数。

您的理解不正确/不完整。

std::vector是一个模板类。如果没有显式实例化,编译器需要实例化调用的方法(通常是源中存在的方法的子集)。

  

有没有办法包含std :: vector的每个成员函数,以便我可以在gdb中访问它们?

对于给定类型T,您应该能够通过请求它来明确地为T实例化整个向量,例如:

template class std::vector<double>;

答案 1 :(得分:9)

尝试按矢量的内部成员打印。

print *(x._M_impl._M_start+0)

此处0是您要检查的数据索引。

灵感来自this answer

答案 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标志。