本文主要介绍3个工具:pdb,objgraph,以及pympler。
1.pdbpdb是专门用于python代码调试,模仿gdb。
使用pdb可以查看堆栈,打印变量等。
这里介绍的是命令行下的pdb。
命令行下使用pdb,代码侵入小,调试方便。
本例中,python安装在当前目录下.venv
使用pdb加载python程序
.venv/bin/python -m pdb orange.py> /Users/lanyang/workspace/orange/orange.py(3)<module>()-> import inspect(Pdb)
启动程序
(Pdb)c
这样,python代码就开始执行了。
相关的命令有
bt 打印堆栈 q 退出 pp 打印变量 c(ont(inue)) 继续执行更多命令可参考:
(Pdb) helpdocumented commands (type help <topic>):========================================EOF c d h List q rv undisplaya cl deBUG help ll quit s untalias clear disable ignore longList r source untilargs commands display interact n restart step upb condition down j next return tbreak wbreak cont enable jump p retval u whatisbt continue exit l pp run unalias whereMiscellaneous help topics:==========================exec pdbobjgraph
安装objgraph
pip install objgraph
查看最常用的类型
(Pdb) import objgraph(Pdb) objgraph.show_most_common_types(limit=20)function 22750dict 15520tuple 12536weakref 6679List 5516type 3449getset_descriptor 3408cell 2566set 2496ModuleSpec 1588module 1582SourcefileLoader 1502wrapper_descriptor 1332builtin_function_or_method 1241method_descriptor 1219property 1171member_descriptor 822classmethod 697WeakSet 571MovedAttribute 501
感觉这个函数没什么用。
查看增长最快的类型
(Pdb) objgraph.show_growth(limit=10)function 22749 +22749dict 15515 +15515tuple 12332 +12332weakref 6680 +6680List 5517 +5517type 3449 +3449getset_descriptor 3408 +3408cell 2565 +2565set 2496 +2496ModuleSpec 1588 +1588
show_growth()
打印两次调用之间增加的类型。如果这其中有自己定义的类型,很可能就是问题所在。如果都是python内置类型,可能要花费更多功夫了。
一般排查问题时,在程序开始执行时,调用show_growth()
,程序跑一段时间后,再次调用show_growth()
,查看哪些对象增长最快。
如果使用pdb在命令行下调试,ctrl+c停止程序的时候,注意观察上下文,保证跟上次import objgraph
时一样,否则,会出现:
(Pdb) objgraph.show_growth(limit=10)*** nameError: name 'objgraph' is not defined(Pdb)
如果出现这个问题,可以继续让程序执行,再ctrl+c停止程序。
查看某个类型
(Pdb) objgraph.by_type('List')
这个可能会打印一堆。
pympler使用objgraph时,虽然可以看到增长最快的对象,但是无法得知占用内存最多的是哪个。
下面我们就使用pympler,查看内存占用。
(Pdb) from pympler import tracker(Pdb) tr = tracker.SummaryTracker()(Pdb) tr.print_diff() types | # objects | total size======================= | =========== | ============ <class 'List | 12769 | 1.18 MB <class 'str | 12769 | 950.47 KB <class 'int | 2513 | 68.71 KB <class 'code | 1 | 144 B function (store_info) | 1 | 136 B <class 'cell | 2 | 96 B <class 'tuple | 1 | 64 B <class 'method | -1 | -64 B <class 'dict | 0 | -128 B(Pdb) tr.print_diff() types | # objects | total size============== | =========== | ============ <class 'List | 1 | 88 B <class 'str | 1 | 70 B(Pdb) tr.print_diff() types | # objects | total size======= | =========== | ============(Pdb)参考
pdb
objgraph
pympler
Python内存泄露调试指导思想
使用gc、objgraph干掉python内存泄露与循环引用!
python 进程内存增长问题,解决方法和工具
总结以上是内存溢出为你收集整理的排查python内存泄露中几个工具的使用全部内容,希望文章能够帮你解决排查python内存泄露中几个工具的使用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)