2014-03-04 18 views
10

我写了一个类似的功能:无法计算功能 - 可以被内联

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

当我尝试使用abc对象指针打印func()gdb,它是给错误:

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

如何我可以从一个内联函数打印值?

+1

试试这个,以避免内联函数。 [如何-可以-I-告诉-GCC-不按直列一个功能](http://stackoverflow.com/questions/1474030/how-can-i-tell-gcc-not-to-内联一个函数) – rmi

+0

^的可能的复制[我怎么能告诉GCC不内联函数?(http://stackoverflow.com/questions/1474030/how-can-i-tell-gcc-not-to -inline-a-function?lq = 1) –

回答

4

当内联函数,它不会出现在可执行一个正确的符号,所以没有办法对gdb来执行它。最简单的做法可能是使用禁用函数内联进行编译,通过-fno-inline-functions或(更好)-O0

+0

添加到此答案中,可以使用__attribute((noinline))__'在特定函数上禁用它。还有'-fno-inline-small-functions',IIRC。另外,如果你还想进行一些优化,函数内联也不会使用'-O1'来启用。 –

+1

在这种情况下,添加-fno-inline-functions不能解决问题。先用你的编译器试试它,然后发布你的答案。 –

+0

@nicky_zs,它使用-O0或-fno-inline-functions工作。 – bytbox

6

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

要解决:

  1. 你可以把FUNC定义在类体外。
  2. 在任何地方的程序中调用函数。