Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ gdb找不到运算符[]_C++_Vector_Gdb - Fatal编程技术网

C++ gdb找不到运算符[]

C++ gdb找不到运算符[],c++,vector,gdb,C++,Vector,Gdb,我可以访问gdb中的任何特定元素。其他成员(如front(),at()等)也会发生同样的情况。我的理解是,编译器/链接器只包括源代码中存在的成员函数,这些函数是我可以在gdb中使用的。是否有一种方法可以包含std::vector的每个成员函数,以便我可以在gdb中访问它们 我的理解是,编译器/链接器只包含源代码中的成员函数,这些函数是我可以在gdb中使用的 你的理解不正确/不完整 std::vector是一个模板类。没有显式实例化,编译器只需要实例化调用的方法(通常是源代码中存在的方法的子集)

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

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

你的理解不正确/不完整

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

有没有一种方法可以包含std::vector的每个成员函数,这样我就可以在gdb中访问它们

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

x[0] = &var1;
模板类std::vector;

或者,您可以使用下面的GDB扩展,它将戳到GNU libstdc++的
std::vector
字段,因此无论是否实例化
operator[]

加载:

template class std::vector<double>;
这将创建一个新的
vref
命令:

(gdb) guile (load "the-file.scm")
代码(需要使用支持构建的GDB):


尝试按向量的内部成员打印

print*(x.\u M\u impl.\u M\u start+0)

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


受。

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

关闭优化?我不确定如何防止编译器/链接器从可执行文件中剥离
[]
运算符代码,但请看下面的答案,了解一个潜在的解决方法:@Qix我只有-g-Wall-onIts没有“剥离”,因为它从未添加。据我回忆(是的,它很粗略;你知道的一个星期一),该操作符不是虚拟的,如果没有使用,那么给定类型的实现也不会扩展。然而,你可能会明确地强迫它,尽管我承认我从未尝试过。这是否回答了你的问题?{请注意,每个问题中都有一些答案没有包含在另一个问题中。}+1,我不知道显式实例化完全实例化了这些作品。直到你提到它,我才真正想过。现在我想得更多了,这完全有道理。谢谢你今天教我一些东西!。为什么显式实例化必须放在主函数之外?@duleshi显式实例化过程会生成一个可识别的类,这与定义一个类相当。如果你不能在main中定义一个类,我不明白为什么你应该被允许在main中进行显式实例化。我使用了这个,它成功了,所以谢谢!!但我不明白为什么我必须这么做,因为在我的代码中我确实使用了模板类的
操作符[]
(这是
boost::interprocess::offset\u ptr
,顺便说一句),所以我猜它无论如何都必须实例化。我没有使用优化。只是一个评论。在Ubuntu16LTS上,这些显式的实例化是不必要的,但在Mac上却是如此。我不能说我试图关闭所有可能的编译器优化(我只是遵守了没有像O1、O2或O3这样的额外技巧)@受雇的俄罗斯人帮我结束了三个小时痛苦的尝试和错误。请把这句话换成一个更自信的回答。因为这篇文章有可能被误认为是一个问题,这在这里是不合适的。
(gdb) guile (load "the-file.scm")
(gdb) vref my_vector 0
(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)