如何在大型代码库中查找调用特定函数的所有函数及多级调用链?
静态查找函数调用链的高效方案
你可以根据所用的编程语言选择对应工具,无需手动处理grep结果,就能直接拿到直接/间接调用foo的完整函数列表和调用链:
编译型语言(C/C++/Rust/Go等)适配方案
- 优先用代码索引工具生成调用图后检索
- 首先用
cscope生成代码索引,执行cscope -Rbq生成索引文件后,直接输入cscope -d -3 foo就能直接输出所有直接调用foo的函数名,自动过滤注释、字符串中的无效匹配 - 要获取多级间接调用的话,可以搭配编译数据库实现全量扫描:
- 生成编译数据库
compile_commands.json(CMake项目加-DCMAKE_EXPORT_COMPILE_COMMANDS=ON参数即可,其他构建工具可以用bear拦截编译过程生成) - 用
clang-query执行自定义查询语句,或者用CodeQL写扫描规则,一行规则就能匹配到所有N层以内间接调用foo的函数
- 生成编译数据库
- 首先用
- 本地IDE/编辑器的索引功能也可直接使用,比如VS Code、Clion打开项目后,右键
foo选择「查找所有引用」或者「查看调用层次结构」,就能直接看到树形的多级调用链,支持批量导出结果
解释型语言(Python/JS/TS/Java等)适配方案
用语言专属静态分析工具效率更高:
- Python项目可以用
pycscope生成索引后查询,要多级调用的话用pycallgraph的静态模式扫描即可 - JS/TS项目可以直接用
ts-call-graph生成全局调用图后检索foo的调用链 - Java项目直接用JDT的索引功能,或者
javaparser解析AST查询调用关系
通用跨语言方案
如果不想安装语言专属工具,可以用通用的代码语义扫描工具ripgrep+ast-grep组合:
- 先用
ast-grep匹配函数调用节点,自动过滤注释、字符串里的foo无效匹配,执行sg -p 'func($$$) { $$$.foo($$$) }' --lang 你的开发语言就能直接输出所有直接调用foo的函数名 - 要多级调用的话,写个简单的脚本循环迭代:先拿到第一层调用方,再查询哪些函数调用了第一层的函数,重复到你需要的调用深度即可,百万行级别的代码库半天就能跑完结果
内容的提问来源于stack exchange,提问作者beardeadclown
相关产品推荐
相关产品推荐

