C ++,STL,GDB:无法评估函数内联

时间:2016-11-16 13:47:08

标签: c++ gdb

我希望能够使用GDB从STL容器中获取地址并打印一对。

I.E:鉴于以下玩具计划:

#include <map>

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

}

当我尝试检查地图的单个元素时(例如p amap.begin())我得到:

“无法评估功能 - 可能是内联的”

删除优化并启用完整调试模式,即(-O0和-g3)不起作用。

为什么会发生这种情况,我该如何解决?

2 个答案:

答案 0 :(得分:9)

这是因为生成的二进制文件中不存在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}

答案 1 :(得分:1)

@ ks1322有正确的答案。以下是一些可能在将来有用的其他信息。

只有std :: map上的构造函数,析构函数和插入方法在debuginfo中:

BC

不过,我们可以调用大小和空方法:

(gdb) info functions std::map
All functions matching regular expression "std::map":

File /usr/include/c++/6/bits/stl_map.h:
std::pair<std::_Rb_tree_iterator<std::pair<int const, int> >, bool> std::map<int, int, std::less<int>, std::allocator<std::pair<int const, int> > >::insert<std::pair<int, int>, void>(std::pair<int, int>&&);
void std::map<int, int, std::less<int>, std::allocator<std::pair<int const, int> > >::map();
void std::map<int, int, std::less<int>, std::allocator<std::pair<int const, int> > >::~map();

那是因为gdb有一些叫做xmethods的东西,一个用于调用模拟函数的python API,它们与未经实例化的函数完全相同。可以找到libstdc ++ xmethods here。如果我们禁用它们,则会显示相同的错误消息:

(gdb) p amap.size()
$1 = 1
(gdb) p amap.empty()
$2 = false