【问题标题】:Cannot evaluate function -- may be inlined无法评估函数——可能是内联的
【发布时间】:2014-03-04 05:34:03
【问题描述】:

我写了一个类似这样的函数:

class abc {
    private :
    int m_var ;
    public :
    int func() { return m_var ; }
};

当我尝试在gdb 中使用abc 对象指针打印func() 时,出现错误:

**Cannot evaluate function -- may be inlined**

如何打印内联函数的值?

【问题讨论】:

标签: c++ gdb


【解决方案1】:

你得到这个错误是因为你把 func 的定义放在类体中,而且它足够小,所以,首先,编译器内联这个函数----这意味着,编译器会用它来替换这个函数调用的所有外观定义,并且该函数的定义不会在可执行文件中。其次,你并没有真正在你的程序中调用那个函数,所以事实上,这个函数永远不会存在于你的最终可执行文件中!

解决这个问题:

  1. 你可以把func的定义放在类体之外。
  2. 在您的程序中的任何地方调用 func。

【讨论】:

    【解决方案2】:

    当函数被内联时,它不会在可执行文件中显示为正确的符号,因此 gdb 无法执行它。最简单的做法可能是在禁用函数内联的情况下进行编译,通过-fno-inline-functions 或(更好)-O0

    【讨论】:

    • 添加到这个答案,您可以使用__attribute((noinline))__ 在特定功能上禁用它。还有-fno-inline-small-functions,IIRC。此外,如果您仍需要一些优化,-O1 也不会启用函数内联。
    • 在这种情况下,添加 -fno-inline-functions 并不能解决问题。先用你的编译器试一试,然后发布你的答案。
    • @nicky_zs,它对我有用 -O0 或 -fno-inline-functions。
    • @bytbox,真的吗?您是否在代码中调用了函数 func ?我试过这个:如果我没有在我的代码中调用这个函数,-fno-inline-functions 不起作用。
    • 要防止链接器删除未调用的函数,请添加__attribute__((used))
    猜你喜欢
    • 1970-01-01
    • 2017-04-06
    • 2011-06-13
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2011-11-04
    相关资源
    最近更新 更多