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

问题描述

| 根据此答案,它应该打印所有函数名称
[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.
但是为什么它对我不起作用?     

解决方法

        这来自gcc手册:   功能功能      产生检测要求   进入和退出功能。只是   在函数输入之后和之前   函数出口,以下分析   函数将与   当前函数的地址和   它的呼叫站点。 (在某些平台上,   __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); 除非有东西实现了这些功能,否则您将获得链接器错误(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标志-警告,我自己还没有尝试过。     ,        您实际上并没有实现任何检测。
-finstrument-functions
开关只是告诉gcc在进入和退出每个函数时调用某个函数。但是您必须自己定义这些功能(通常是通过链接探查器库来完成的)。     ,        编码__cyg_profile_func_enter和__cyg_profile_func_exit并不复杂。最简单的解决方案是确保上述功能将地址详细信息写入文件,并具有单独的过程以从文件中读取地址并使用可执行文件的符号表来解析它们。如果尝试在函数本身中进行地址解析,则可能需要一些时间。 我遇到了以下文章- http://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/ 为此,它使用binutils中的addr2line。检查这是否对您有帮助     ,        这里提供了您要查找的实现。