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