使用tracemalloc排查内存泄漏无法获取多层调用栈帧如何解决
问题原因
你配置的tracemalloc采集栈帧深度是正确的,tracemalloc.get_traceback_limit()返回值匹配你的设置就证明采集环节没有问题。只能拿到1层栈帧的核心原因是你调用snapshot.statistics()时选择了lineno作为分组规则:
lineno分组规则会按照内存分配发生的代码行做聚合统计,聚合过程中只会保留栈顶的1帧用来做分组标识,其余采集到的栈帧会被丢弃,不会出现在最终返回的统计项中。
修复方法
将代码中统计内存快照的逻辑做一处修改即可:
把
top_stats = snapshot.statistics("lineno")
替换为
top_stats = snapshot.statistics("traceback")
traceback分组规则会按照完整的调用栈做聚合,会保留所有采集到的栈帧信息,修改后你调用stat.traceback.format()就能输出多层嵌套的调用栈了,符合你排查内存泄漏的需求。
内容的提问来源于stack exchange,提问作者AivanF.
相关产品推荐
相关产品推荐

