我希望能够使用 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 -- may be in-lined"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40633787/