理解为何gprof中部分函数未被剖析、calls列无统计取值
gprof报告calls字段空白的实际含义
根据gprof的工作机制,报告里calls字段为空白,本质是对应函数没有被gprof的调用计数模块采集到调用次数数据,不是gprof统计遗漏,也不是函数没被实际执行。
结合你贴出的报告内容,出现这个现象的核心原因和运行配置无关:你提到没有配置特殊编译、运行选项,但报告里能看到gprof专属的自动生成函数frame_dummy,说明主程序必然是带-pg选项编译的(没有这个插桩选项,根本生成不了gprof格式的报告)。
出现calls空白的常见触发场景有两个:
- 函数所在的编译单元没加
-pg插桩
gprof的调用次数统计完全依赖编译时的插桩逻辑:加-pg编译时,会在每个函数入口自动插入记录调用次数、回溯调用栈的钩子代码。如果工程是分模块编译的,主程序加了-pg,但BilinearForm类实现对应的编译单元在编译时忘了加-pg,链接成完整程序后,这些没被插桩的函数就只能通过CPU时间采样机制被统计到耗时(也就是你看到的self time列的数值),但拿不到调用次数,所以calls列、需要基于调用次数计算的ms/call、total列都会留空。 - 高编译优化等级把插桩逻辑优化失效
如果编译时用了-O2及以上的优化等级,编译器可能会通过跨模块分析消除冗余的插桩代码,或者把函数做内联、位置重排,导致原本在函数入口的计数钩子失效,gprof自然也采集不到调用次数数据。
你报告里三个占了绝大多数运行时间的BilinearForm相关函数,就是因为没有对应的插桩计数,才会出现calls字段空白的情况;而frame_dummy本身就是gprof插桩流程生成的辅助函数,所以计数完整。
内容的提问来源于stack exchange,提问作者lucmobz
相关产品推荐
相关产品推荐

