我希望能够使用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)不起作用。
为什么会发生这种情况,我该如何解决?
答案 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