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:如何只跟踪特定的函数调用的主要内容,如果未能解决你的问题,请参考以下文章
如何编写stap(systemtap)来查看某个进程是否调用了特定的内核函数?