我希望能够使用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)
@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)