接手体量较大的代码工程时,逐个搜索函数名称很难快速看清入口、下游调用和影响范围。Understand可以依据项目数据库中的调用引用生成函数调用图,但图中能否展示完整关系,取决于源码是否完成解析、调用目标能否识别,以及图形深度和过滤条件是否合适。处理Understand怎么生成函数调用图Understand函数调用图显示不完整如何排查,应先确认项目分析状态,再调整图形范围。
一、Understand怎么生成函数调用图
Understand中的Calls图用于查看当前函数调用了哪些函数,Called By图用于查看哪些函数调用了当前函数,Butterfly则把上下游关系放在同一张图中。节点代表函数或方法,节点之间的连线表示调用关系。
1、先完成项目分析
生成调用图前,应保证项目文件已经完成解析。分析未结束或中途取消时,数据库中的调用引用可能不完整。
①打开已经配置好的Understand项目。
②进入【Project】→【Analyze All Files】。
③等待左下角分析进度结束。
④打开【View】→【Analysis Log】。
⑤检查是否存在解析错误或缺失头文件。
分析被取消后,项目仍可能正常打开,但部分文件和引用还没有写入数据库。此时直接生成调用图,容易出现函数缺失、调用链中断等情况。
2、从目标函数生成调用图
①在编辑器、搜索结果或实体列表中找到目标函数。
②右键单击函数名称。
③进入【Graphical Views】。
④选择【Calls】查看下游调用。
⑤选择【Called By】查看上游调用。
⑥需要同时观察两侧时选择【Butterfly】。
双击图中的函数节点,可以跳转到相应实体或源代码位置。遇到较长调用链时,也可以选中中间节点,以该函数为新的起点继续展开。
3、调整调用图的显示层级
默认调用图通常只展开有限层级。入口函数下方还有调用关系却没有显示时,应先检查Depth或Level设置。
①在调用图空白区域单击右键。
②打开图形选项或显示设置。
③提高【Depth】或【Level】数值。
④按需切换Graph Variant。
⑤重新布局并检查新增节点。
Understand图形支持深度等显示选项,不同Graph Variant会采用不同的节点组织和简化方式。大型工程不宜一开始就展开全部层级,可以先查看两到三层,再从关键节点继续生成局部调用图。
4、整理并导出调用图
①隐藏与当前分析无关的节点。
②折叠公共工具函数或重复分支。
③调整节点位置和图形布局。
④选择图形保存或导出命令。
⑤设置PNG、SVG等输出格式。
用于技术文档时,SVG放大后更容易保持清晰。节点数量较多时,按模块或业务入口分别导出,通常比把整个项目挤进一张图更容易阅读。
二、Understand函数调用图显示不完整如何排查
调用图缺少某个函数时,应先判断它是否已经进入Understand数据库。函数根本没有完成解析,与函数已经解析但调用关系没有建立,处理方向并不相同。
1、检查源文件是否纳入项目
①搜索缺失函数的定义位置。
②确认对应源文件已经加入项目。
③检查文件夹是否被排除。
④核对头文件搜索路径。
⑤检查项目使用的条件编译宏。
⑥修正配置后重新分析。
包含目录或宏定义与实际构建环境不一致时,Understand解析到的代码分支也可能不同。调用链恰好经过未解析文件时,图形通常会停在前一个可识别函数。
2、检查图形深度和过滤条件
图形只显示一两层,或者部分节点之前被隐藏,应先恢复显示设置。
①提高调用图的展开深度。
②取消仅显示选中实体的限制。
③恢复隐藏的节点和连接线。
④检查是否启用了目录或架构过滤。
⑤重新生成调用图进行对比。
大型项目中,可以从缺失节点前面的函数单独生成Calls图。这样更容易判断是总图层级不够,还是数据库中确实没有这条调用关系。
3、检查函数指针和动态调用
C/C++函数指针、回调表、宏封装、虚函数和动态加载,都可能使静态分析难以确定唯一调用目标。
遇到这种情况,可以打开实际调用语句,查看目标是否被标记为Unresolved或Unknown,再检查函数指针赋值、虚函数实现和宏展开结果。
静态调用图展示的是能够从源码中建立的调用关系,并不完全等同于程序某次运行产生的调用轨迹。某些目标只有在运行时才能确定,图中没有继续展开并不一定代表源码中不存在调用。
4、检查重载函数和外部库
项目存在重载、模板实例、静态同名函数时,图中的函数名称可能看起来一样,实际却属于不同文件或参数签名。
①查看节点的完整限定名称。
②核对参数列表和所属文件。
③确认选中的是正确函数实体。
④检查外部库是否只有声明。
⑤必要时从不同实体分别生成调用图。
对于只有头文件声明、没有源码实现的预编译库,Understand通常只能展示调用到库接口,无法继续展开库内部函数。继续增加Depth也不会补出缺失的实现关系。
三、调用图恢复后怎么验证
调用图显示恢复后,还要结合引用列表和源代码核对,避免把布局变化误认为调用关系已经完整。
1、对照Calls和Called By引用
①选中需要检查的函数。
②查看信息区域中的Calls和Called By。
③核对引用列表与图中节点。
④双击调用记录检查源代码。
⑤对异常文件重新执行分析。
引用列表和图中都没有对应关系时,重点检查项目解析;引用列表已经存在而图中没有时,则重点检查显示深度、隐藏规则和图形变体。
2、从多个入口分段查看
启动函数、线程入口、回调入口和消息处理函数可以分别生成调用图,再按照模块整理。
这种方式能减少递归调用、公共工具函数和重复节点带来的视觉干扰,也更适合做功能流程梳理和代码变更影响分析。
总结
处理Understand怎么生成函数调用图Understand函数调用图显示不完整如何排查,关键是先保证项目完成解析,再根据需要选择Calls、Called By或Butterfly视图。图形缺失时,应依次检查分析日志、项目文件范围、显示深度、过滤条件和动态调用结构。把调用图与引用列表、源代码位置一起核对,才能判断是图形显示受限,还是调用关系没有成功建立。希望本文能为大家查看和排查Understand函数调用图提供参考,如需进一步了解相关内容,可联系咨询。