gdb找不到操作符[]

gdb Could not find operator[]

本文关键字:操作符 找不到 gdb      更新时间:2023-10-16
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]时,我得到:

无法找到操作符[].

现在如果我在push_back后面加上这行:

x[0] = &var1;

我可以访问gdb中的任何特定元素。同样的事情发生在其他成员,如front()at()等。我的理解是编译器/链接器只包括源代码中存在的成员函数,这些是我可以在gdb中使用的函数。是否有一种方法包括std::vector的每个成员函数,以便我可以在gdb中访问它们?

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

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

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

是否有一种方法包括std::vector的每个成员函数,以便我可以在gdb中访问它们?

对于给定类型T,你应该能够显式地实例化整个向量为T,通过请求,例如:

template class std::vector<double>;

尝试按vector的内部成员打印。

print *(x._M_impl._M_start+0)

这里0是要检查的数据的索引。

灵感来自这个答案

或者,您可以使用下面的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)

由于某种原因,.at(), .begin()函数对我有效。可能是因为我设置了-g标志