3

使用 GDB (CGDB) 我可以进入 C++ 标准库容器的代码,例如std::vectoror std::set,但不是std::string. 有谁知道为什么?我可以以某种方式启用它吗?我正在使用 Ubuntu 20.04。

#include <vector>
#include <set>
#include <string>

int main(int argc, char *argv[])
{
  std::vector<double> v;
  std::set<double> s;
  std::string str;
  return 0;
}

例如,用 编译上面的代码后g++ -g debug.cpp,我可以进入std::vectorandstd::set构造函数(以及基类构造函数等),但不能进入std::string.

4

1 回答 1

2

有谁知道为什么?

发生这种情况是因为std::vectorstd::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::方法。大多数情况下,您可以假设它们正常工作,和/或查看源代码以了解它们是如何实现的。

于 2020-07-02T04:08:28.353 回答