首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在tracemalloc快照比较(python3.6)中从反向跟踪中获得更多帧?

如何在tracemalloc快照比较(python3.6)中从反向跟踪中获得更多帧?
EN

Stack Overflow用户
提问于 2019-07-08 12:44:18
回答 1查看 610关注 0票数 4

对我问题的描述

我试图在python3.6程序中查找一个内存泄漏。

为此,我正在测试tracemalloc,它允许我比较内存快照并打印一个“回溯”。

返回跟踪中的最大帧数应该设置为tracemalloc.start()的第一个参数,根据文档

然而,在我的最小测试设置(下面的代码)中,我使用参数25启动tracemalloc,但是我在回跟踪中只得到了1帧,在这里我期望2:

我得到的作为输出

代码语言:javascript
复制
me@my_machine:/tmp$ python ./test_tm.py 

Entry: /tmp/test_tm_utils.py:2: size=3533 KiB (+3533 KiB), count=99746 (+99746), average=36 B
Traceback:
  /tmp/test_tm_utils.py:2

我所期望的产出

我希望有两行,像这样:

代码语言:javascript
复制
Entry: /tmp/test_tm_utils.py:2: size=3533 KiB (+3533 KiB), count=99746 (+99746), average=36 B
Traceback:
  /tmp/test_tm_utils.py:2
  /tmp/test_tm.py:10
  ^^^^^^^^^^^^^^^^^^

最小代码样本

主程序in _/tmp/test_tm.py

代码语言:javascript
复制
import tracemalloc

tracemalloc.start(25)
import test_tm_utils


if __name__ == '__main__':

    s1 = tracemalloc.take_snapshot()
    test_tm_utils.myfun()

    s2 = tracemalloc.take_snapshot()

    diff = s2.compare_to(s1, 'lineno')

    for entry in diff[:1]:
        print('\nEntry: {}'.format(entry))
        print('Traceback:')
        for line in entry.traceback:
            print('  {}'.format(line))

test_tm_utils.py中的内存泄漏函数

代码语言:javascript
复制
def myfun(lst=list()):
    lst.append([i for i in range(100000)])
EN

回答 1

Stack Overflow用户

发布于 2021-05-06 21:46:11

秘诀是key_type参数。必须使用值"traceback"来获取tracemalloc.start()中指定的所有行。如果使用"lineno""filename",则只得到一行。

对于统计数据或在您的例子中,都是如此。

所以您的代码应该如下所示:

代码语言:javascript
复制
s2 = tracemalloc.take_snapshot()

diff = s2.compare_to(s1, 'traceback') # This is the only change

for entry in diff[:1]:
    print('\nEntry: {}'.format(entry))
    print('Traceback:')
    for line in entry.traceback:
        print('  {}'.format(line))
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56935252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档