来源:https://stackoverflow.com/questions/8887810/how-to-get-doxygen-to-produce-call-caller-graphs-for-c-functions
看这个回答
我们试一下,一个项目只有下面一个 C 文件:
#include <stdio.h>
#include <stdlib.h>
extern char etext, edata, end; /* The symbols must have some type,
or "gcc -Wall" complains */
extern char _end;
void foo() {
printf("end = %c\n", end);
printf("_end = %c\n", _end);
printf("First address past:\n");
printf(" program text (etext) %10p\n", &etext);
printf(" initialized data (edata) %10p\n", &edata);
printf(" uninitialized data (end) %10p\n", &end);
printf(" uninitialized data (_end) %10p\n", &_end);
}
int
main(int argc, char *argv[])
{
foo();
exit(EXIT_SUCCESS);
}
在同一目录下运行
doxygen -g
获得了 Doxyfile
随后对 Doxyfile 进行修改,把下面几个变量设置成 YES (除了 CALLER_GRAPH)
HAVE_DOT = YES
EXTRACT_ALL = YES
EXTRACT_PRIVATE = YES
EXTRACT_STATIC = YES
CALL_GRAPH = YES
CALLER_GRAPH = NO
DISABLE_INDEX = YES
GENERATE_TREEVIEW = YES
RECURSIVE = YES
再运行
doxygen Doxyfile
随后打开文件浏览器,点击 html 文件夹,再点开 index.html,进入 test.c 文件中,再这里能看到 call graph 和 caller graph,如下图
需要注意的是:这种方法在遇到 indirect call 的时候不会生成 callgraph
此外,这种方法由于是静态分析,在遇到 indirect call 以及 “不同条件,同一个宏表示不同函数” 这些情况时,无法正确解析 callGraph
所以,如果有条件实现 ftrace 还是建议实现 ftrace,或者用一些动态分析工具