我希望能够使用GDB从STL容器中获取地址并打印一对。
例如,给定以下玩具程序:

#include <map>

int main()
{
  std::map<int,int> amap;
  amap.insert(std::make_pair(1,2));

}
我编译为:
g++ -ggdb3 -O0 -std=c++11 -Wall -Wextra -pedantic -o main.out main.cpp
然后,当我尝试检查 map 的单个元素时,例如:
p amap.begin())
我得到:
"Cannot evaluate function -- may be in-lined"
为什么会发生这种情况,我该如何解决?
在Ubuntu 20.04,GCC 9.3.0、2.34中进行了测试。

最佳答案

这是因为在生成的二进制文件中不存在amap.begin()。这就是C++模板的工作方式:如果您不使用或显式实例化某些模板方法,则不会在生成的二进制文件中生成该模板方法。

如果您确实想从gdb调用amap.begin(),则必须实例化它。一种方法是实例化std::map的所有方法:

#include <map>

template class std::map<int,int>;

int main()
{
  std::map<int,int> amap;
  amap.insert(std::make_pair(1,2));
}

gdb session :
(gdb) p amap.begin()
$1 = {first = 1, second = 2}

关于C++,STL,GDB : Cannot evaluate function maybe inlined,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40633787/

10-12 23:57