开发者

Why doesn't `-finstrument-functions` work for me?

According to this answer,it should print all function names:

[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.

But why it's not working for me?


This is from the gcc manual:

-finstrument-functions

Generate instrumentation calls for entry and exit to functions. Just after func- tion entry and just before function exit, the following profiling functions will be called with the address of the current function and its call site. (On some platforms, __builtin_return_address does not work beyond the current func- tion, so the call site information may not be available to the profiling functions otherwise.)

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

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

Unless somthing implements those functions, you will get linker errors (which is what happens with MinGW). Conceivably, your GCC version is providing empty implementations.

I got it to work with MinGW GCC by providing this implementation:

#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 );
}

but this only gives the function addresses. I'd have thought there should be a GCC default implementation of this, but there doesn't seem to be.

People may also be interested in this visualisation of the call tree, which uses the -fintrument-functions flag - caveat, I haven't tried it myself.


You didn't actually implement any instrumentation. The -finstrument-functions switch just tells gcc to call some function at entry and exit to each function. But you have to define these functions yourself (normally this is done by linking a profiler library in).


Coding __cyg_profile_func_enter and __cyg_profile_func_exit is not complicated. Easiest solution will be to ensure that the above functions write the address details to a file and have a seperate process to read the addresses from the file and resolve them using symbol table of the executable. If you try to do address resolution in the function itself it may take some time.

I came across following article - http://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/

Which uses addr2line from binutils for this purpose. Check if this helps you

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜