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