为什么`-finstrument-functions`对我不起作用?

时间:2011-05-30 12:26:47

标签: gcc

根据this answer,它应该打印所有函数名称:

[root@ test]# cat hw.c
#include <stdio.h>

int func(void)
{  
  return 1;
}
int main(void)
{
  func();
  printf("%d",6);
  return 6;
}
[root@ test]# gcc -Wall hw.c -o hw -finstrument-functions
[root@ test]# ./hw 
6
[root@ test]# gcc --version
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-48)
Copyright (C) 2006 Free Software Foundation, Inc.

但为什么它不适合我?

4 个答案:

答案 0 :(得分:6)

这是来自gcc手册:

  

-finstrument函数

     

生成检测调用   进入和退出功能。只是   在功能输入之后和之前   函数退出,以下分析   函数将被调用   当前功能的地址和   它的通话网站。 (在某些平台上,   __builtin_return_address不能超出当前的功能,所以   呼叫站点信息可能不是   可用于分析功能   否则。)

     

void __cyg_profile_func_enter(void * this_fn,void * call_site);

     

void __cyg_profile_func_exit(void * this_fn,void * call_site);

除非somthing实现这些功能,否则会出现链接器错误(MinGW会发生这种情况)。可以想象,您的GCC版本提供了空实现。

我通过提供此实现让它与MinGW GCC合作:

#include  <stdio.h>

void __cyg_profile_func_enter (void *this_fn, void *call_site) {
    printf( "entering %p\n", this_fn );
}

void __cyg_profile_func_exit (void *this_fn, void *call_site) {
    printf( "leaving %p\n", this_fn );
}

但这只给出了函数地址。我原本以为应该有一个GCC默认实现,但似乎没有。

人们可能也对使用-fintrument-functions标志的this visualisation of the call tree感兴趣 - 我没有尝试过。

答案 1 :(得分:1)

您实际上并未实施任何检测。 -finstrument-functions开关只是告诉gcc在进入和退出每个函数时调用一些函数。但您必须自己定义这些函数(通常通过链接分析器库来完成)。

答案 2 :(得分:0)

编码__cyg_profile_func_enter和__cyg_profile_func_exit并不复杂。最简单的解决方案是确保上述函数将地址详细信息写入文件,并具有单独的进程以从文件中读取地址并使用可执行文件的符号表解析它们。如果您尝试在函数本身中进行地址解析,则可能需要一些时间。

我发现以下文章 - http://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/

为此目的,使用binutils中的addr2line。检查这是否有帮助

答案 3 :(得分:0)

提供了您正在寻找的实施here