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

SFD*_*SFD 5 c++ gdb

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

IE:鉴于以下玩具计划:

#include <map>

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

ks1*_*322 10

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

如果你想amap.begin()从gdb 调用,你必须实例化它.一种方法是实例化以下所有方法std::map:

#include <map>

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

int main()
{
  std::map<int,int> amap;
  amap.insert(std::make_pair(1,2));
}
Run Code Online (Sandbox Code Playgroud)

gdb会话:

(gdb) p amap.begin()
$1 = {first = 1, second = 2}
Run Code Online (Sandbox Code Playgroud)


Dan*_*und 6

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

只有 std::map 上的构造函数、析构函数和插入方法位于 debuginfo 中:

(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();
Run Code Online (Sandbox Code Playgroud)

尽管如此,我们仍然可以调用 size 和empty 方法:

(gdb) p amap.size()
$1 = 1
(gdb) p amap.empty()
$2 = false
Run Code Online (Sandbox Code Playgroud)

这是因为 gdb 有一个叫做 xmethods 的东西,这是一个用于调用模型函数的 Python API,其工作方式与尚未实例化的函数相同。libstdc++ xmethods 可以在这里找到。如果我们禁用它们,则会出现相同的错误消息:

(gdb) disable xmethod
(gdb) p amap.size()
Cannot evaluate function -- may be inlined
(gdb) p amap.empty()
Cannot evaluate function -- may be inlined
(gdb) 
Run Code Online (Sandbox Code Playgroud)