有谁知道为什么?
发生这种情况是因为std::vector
和std::set
是模板类,它们(必须)在头文件中定义,而std::string
不是。
为了避免std::string
在每个.cpp
文件中重复编译方法,这些方法定义在libstdc++
.
您无法进入它们,因为您尚未安装libstdc++
调试符号包。
我可以以某种方式启用它吗?
是:安装libstdc++
适合您系统的调试信息。在我的(Debian)系统上libstdc++6-dbgsym
,安装了它,你会看到类似的东西:
Breakpoint 1, main (argc=1, argv=0x7fffffffdc28) at t.cc:9
9 std::string str;
(gdb) s
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string (this=0x7fffffffdaa0) at /build/gcc-10-R1sACw/gcc-10-10-20200324/build/x86_64-linux-gnu/libstdc++-v3/include/bits/basic_string.h:433
433 /build/gcc-10-R1sACw/gcc-10-10-20200324/build/x86_64-linux-gnu/libstdc++-v3/include/bits/basic_string.h: No such file or directory.
现在,这仍然很糟糕,因为它指的是临时构建目录,它不存在于任何地方,除了在维护者系统上。
但是您可以使用 GDBdir
命令将 GDB 指向适当的源目录(您可以通过安装源包来获得libstdc++
)。
PS您也可以通过构建自己的g++
版本来避免这个问题,但这可能比它的价值更麻烦。
PPS 您实际上很少需要介入std::string
(或任何其他std::
方法。大多数情况下,您可以假设它们正常工作,和/或查看源代码以了解它们是如何实现的。