c++ - STL 模板容器的 GDB 中的 "Cannot evaluate function -- may be in-lined"错误

标签 c++ gdb

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

相关文章:

c++ - 在 C++ 中重写 = 运算符时如何初始化静态成员

c++ - 如何调试加载共享库

gdb - 在退出时获取劣质进程的回溯

c - 如何在另一个 C 任务中调用 JNI 的 C 方法?

c++ - 一个 QThread 对象中的槽函数可以并发运行吗?

python - 无法使用 python ctypes 加载 C++ 共享库

gdb - 如何使用gdb捕获程序的 "exit"

visual-studio-code - 当文件名包含非 ascii (unicode) 字符时,gdb 显示 "No such file or directory"

c++ - C++ 中的日期字符串 [使用 Anjuta IDE]

c++ - 从类型名称列表中提取 C++ 变体类型