gdb找不到操作符[]
gdb Could not find operator[]
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标志
相关文章:
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 找不到QtResource文件中的文件
- VC++本机单元测试,找不到调试符号
- RegGetValue在当前用户下找不到名称
- 带有 -stdlib=libc++ 的 clang++ 9.0.1 找不到<optional>
- c++找不到具有相同哈希的无序集合元素
- 找不到以下加速库:boost_fiber
- 找不到 FLTK(缺少:FLTK_INCLUDE_DIR)
- 设置 Visual Studio for MPI: 找不到标识符错误
- "assimp/config.h"找不到,但它在文件夹中
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- C++系统找不到指定的文件错误
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- vcpkg 添加新库,但找不到
- gdb找不到操作符[]
- gdb:找不到操作符[]