2011-05-08 45 views
1

我有这个问题,我必须找到在我的代码中调用特定的宏/函数多少次?我知道你可能会想为什么不运行find/grep。但我的问题是被调用的函数/宏是在特定的编译时宏。所以我想只有当这个特定的编译时间宏被启用时才能找到调用的数量。我想查找整个代码中的调用数量(静态分析,而不是运行时)。该代码库非常庞大(数百万行代码),并完全在Linux上使用C语言编写。我试图使用readelf,但我不能真正提取所需的信息。任何帮助将不胜感激。在编译时宏下查找函数/宏调用的数量

在此先感谢。 〜N

回答

2

许多C编译器都有一个标志来输出预处理器阶段中间输出(以及相关的条件编译符号定义)。然后你可以在这个输出上运行find/grep。

0

如何在上述宏中嵌入一些唯一字(如MARKER以下) 并计算该字出现的次数?
例如,假设一个代码a.c类似如下:

#define A f() MARKER 
#define B A; A; 
B 

,标记显示将与命令等 能够得到以下的计数:

gcc -E a.c | sed -r 's/[^A-Za-z0-9_]+/\xa/g' | grep MARKER | wc -l 

测量后,MARKER在宏将需要删除 或#define d为空:

#define MARKER 

编辑: 如果你的编译系统是make,你可能需要添加像 以下到您当前的makefile新规则,使处理后的文件:

SRCS = a.c 

preprocessed: $(SRCS:.c=.i) 

%.i: %.c 
    $(CC) -E $(CPPFLAGS) -o [email protected] $< 

如果所有的设置都 通过使用make preprocessedfind -type f -name '*.i'或者类似的 命令,将获得所有预处理的文件。 可能这不是一件容易的事。 如果您遇到困难,我建议您发布该问题作为一个新问题。

+0

非常感谢Ise,我也曾想过这种方法,但无法使用它,因为我无法在文件上运行“gcc -E test.c -o test.i”。当我这样做时它会抛出一些灾难性的错误,说它找不到一些包含文件等。我的项目有很多目录和包含文件分散在多个地方..所以我不太确定是否有任何我需要包括运行的选项。 。对不起,我知道我在问一个相当微不足道的问题。 – Chatter 2011-05-08 15:31:44

+0

嗯...请参阅编辑。 – 2011-05-08 16:45:57