我正在寻找一种方法来自动将代码添加到函数的开头和开头。想法是我想稍后分析正在运行的代码。例如,我有以下功能:
void helloWorld(){
printf("Hello World!\n");
}
void worldHello(){
printf("World hello!\n");
}
我想要某种宏将它们扩展为:
void helloWorld(){
printf("Function id 1 enter");
printf("Hello World!\n");
printf("Function id 1 exit");
}
void worldHello(){
printf("Function id 2 enter");
printf("World hello!\n");
printf("Function id 2 exit");
}
每次使用我的宏时,id都是唯一给出的。对我如何实现这一点有任何好处吗?我看了GCC的“__COUNTER__”,但并没有像我想的那样真正地工作。
答案 0 :(得分:4)
如果您正在使用GCC,请查看-finstrument-functions
开关 - 请参阅https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html#index-finstrument-functions它在进入和离开任何被调用的函数时基本上调用用户定义的函数。这有一些优点:
return
并且不在乎)答案 1 :(得分:3)
您可以使用函数名称而不是数字作为ID。因为函数名是唯一的。 例如,您可以使用宏:
#define START printf( "%s:%d Start \n", __func__, __LINE__)
#define END printf("%s:%d End \n", __func__, __LINE__)
或在内核中:
#define START pr_err(KBUILD_MODNAME ":%s:%d start \n", __func__, __LINE__)
#define END pr_err(KBUILD_MODNAME ":%s:%d end\n", __func__, __LINE__)
答案 2 :(得分:1)
使用__func__而不是__COUNTER__可能更具描述性。下面是一个宏的示例实现,可以执行您想要的操作。
#include <stdio.h>
#define WRAPPED_FUNC(funcname, ...) \
funcname { \
printf("Function %s entered\n", __func__); \
__VA_ARGS__ \
printf("Function %s exited\n", __func__); \
}
WRAPPED_FUNC(
void helloWorld(),
{
printf("Hello World!\n");
}
)
WRAPPED_FUNC(
void worldHello(),
{
printf("World hello!\n");
}
)
int main() {
helloWorld();
worldHello();
return 0;
}