赞
踩
Python的单进程调试可直接使用pdb模块进行调试,具体调试方法有两种:
直接在Python程序启动时加入pdb模块,例如对foo.py程序进程调试: python -m pdb foo.py
。
在Python程序内部使用pdb:
import pdb
...
if __name__ == '__main__':
...
# make breakpoint
pdb.set_trace()
...
使用pdb进行调试,需要将子进程的IO进行重定向,然后进行调试,如下代码:
import pdb class ForkedPdb(pdb.Pdb): """A Pdb subclass that may be used from a forked multiprocessing child """"" def interaction(self, *args, **kwargs): _stdin = sys.stdin try: sys.stdin = open('/dev/stdin') pdb.Pdb.interaction(self, *args, **kwargs) finally: sys.stdin = _stdin ... # worker is a subprocess function def worker(): ... # make breakpoint ForkedPdb().set_trace() ... ...
使用remote_pdb进行调试,remote_pdb设置断点之后,需要使用telnet之类的工具连接到对应的端口进行调试就行。
import remote_pdb
...
# worker is a subprocess function
def worker():
...
# make breakpoint
remote_pdb.set_trace()
...
...
在调试代码段加入以上内容之后,代码在运行的时候会有端口信息,之后用telnet连接到对应端口就能调试了。
直接使用python-gdb支持的gdb进行调试,使用gdb -p [PID]
进行调试,其中PID为指定的子进程号。需要对gdb加入python支持(对gdb加入python支持本人没有搞好,如果有成功的例子欢迎大家交流)。
获取数据
获取全局数据:运行命令 python -m cProfile -o tmp.prof run.py
之后,会在当前文件夹下面生成关于run.py程序的性能记录文件tmp.prof。
记录程序特定代码段的性能数据:
import cProfile
import pstats
...
profiler = cProfile.Profile()
profiler.enable()
# code to profile
profiler.disable()
p = pstats.Stats(profiler).sort_stats('tottime')
# p.print_stats(10) # print top 10
# p.strip_dirs() # hide the directory path information
p.dump_stats('tmp.prof') # dump the profiling record to file tmp.prof
gprof2dot -f pstats tmp.prof | dot -Tsvg -o prof.svg
得到分析图。pip install pyprof2calltree
。pyprof2calltree -i tmp.prof -o callgrind.tmp
。PS:使用上述性能分析工具只能分析到Python函数的信息,不能分析到Python调用C++库的函数信息。并且得到的函数调用图里面的调用关系有些许省略。
Python优化第一步 性能分析实践: https://zhuanlan.zhihu.com/p/24495603
gprof2dot工具: https://github.com/jrfonseca/gprof2dot
KCacheGrind win下载地址: https://sourceforge.net/projects/qcachegrindwin/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。