gcc:如何只跟踪特定的函数调用

Posted

技术标签:

【中文标题】gcc:如何只跟踪特定的函数调用【英文标题】:gcc: how to only trace specific functions calls 【发布时间】:2014-10-11 04:39:11 【问题描述】:

选项-pg-mfentry-finstrument-functions 影响.c 文件中的所有函数, 如何仅将跟踪调用插入特定函数,而不是全部?

我检查了gcc function attributes,但似乎没有可用于装饰特定功能的-pg-mfentry-finstrument-functions 的对应物。

no_instrument_function 排除函数,但我想要的是相反的,即包含函数。

【问题讨论】:

您可以使用您的 MELT 扩展来自定义 GCC。 【参考方案1】:

您可以使用C 中的Backtraces 来做到这一点。但是使用这种方法,您必须在要跟踪的函数中添加一些代码。

这是一个简单的例子:

 #include <execinfo.h>
 #include <stdio.h>
 #include <stdlib.h>

 /* Obtain a backtrace and print it to stdout. */

 void print_trace (void)
 
   void *array[10];
   size_t size;
   char **strings;
   size_t i;

   size = backtrace (array, 10);
   strings = backtrace_symbols (array, size);
   printf ("Obtained %zd stack frames.\n", size);

   for (i = 0; i < size; i++)
      printf ("%s\n", strings[i]);
   free (strings);
 

 /* A dummy function to make the backtrace more interesting. */

 void dummy_function (void)
 
   print_trace ();
 


 int main (void)
 
   dummy_function ();
   return 0;
 

在编译时将-g -rdynamic 标志添加到链接器:

 gcc -g -rdynamic example.c -o example

【讨论】:

【参考方案2】:

使用-finstrument-functions,您可以过滤 __cyg_profile_func_enter 和 __cyg_profile_func_exit 中的函数地址,以便仅使用您要跟踪的函数。

为了更加友好并按函数名称而不是地址进行过滤,您可以根据符号表的数据构建一个哈希表。

【讨论】:

以上是关于gcc:如何只跟踪特定的函数调用的主要内容,如果未能解决你的问题,请参考以下文章

让 gcc 在 c 操作之间调用特定的函数

ARM Cortex M3上的GCC:从特定地址调用函数

如何编写stap(systemtap)来查看某个进程是否调用了特定的内核函数?

如何使用 dtrace 跟踪函数?

用户空间程序的函数跟踪器 (Function Tracer)

如何在 C 中跟踪函数调用?