zoukankan      html  css  js  c++  java
  • Python 调试工具

    http://www.oschina.net/translate/python-debugging-tools

    这是一个我用于调试或分析工具概述,不一定是完整全面,如果你知道更好的工具,请在评论处标记。

    日志

    是的,的确,不得不强调足够的日志记录对应用程序是多么的重要。您应该记录重要的东西,如果你的记录足够好的话,你可以从日志中找出问题从而节省大量的时间。

    如果你曾经用print语句来调试代码现在停下吧,用logging.debug替代,开始可以慢慢来,以后完全禁用它...

    Garfielt
    Garfielt
    翻译于 10个月前

    0人顶

     

     翻译的不错哦!

    追踪

    有时看到程序如何被执行会很有帮助。你可以使用IDE的调试共轭ngn一步一步的运行程序,但你需要知道你要找的是什么,否则这将会是一个漫长的过程。 
    标准库中有一个 trace模块,可以打印所有执行过程中的内容(像制作 覆盖率报告)。 
    1 python -mtrace --trace script.py
    这将产生大量输出(每个行会被打印输出,所以你最好通过管道,用grep只看自己感兴趣的部分),例如: 
    1 python -mtrace --trace script.py | egrep '^(mod1.py|mod2.py)'
    -  
    如果你喜欢新特性,那么你可以尝试 smiley - 它可以显示变量内容变化,还可以用它来远程追踪程序。 
    Garfielt
    Garfielt
    翻译于 10个月前

    1人顶

     

     翻译的不错哦!

    其它翻译版本(1)
    PDB 
    1 import pdb
    2 pdb.set_trace() # opens up pdb prompt
    或者: 
    1 try:
    2     code
    3     that
    4     fails
    5 except:
    6     import pdb
    7     pdb.pm() # or pdb.post_mortem()
    或(按键盘C键启动脚本): 
    1 python -mpdb script.py

    像在REPL中那样:

    • c or continue
    • q or quit
    • l or list, 在当前界面显示源码
    • w or where, 显示回溯
    • d or down, 显示回溯的下一界面
    • u or up, 显示回溯的上一界面
    • <enter>, 重复最后一个命令
    • 其他任何东西,在当前界面评估源码 (t还有其他的一些命令)
    corcontinue 
    qorquit 
    lorlist,显示在当前帧的源 
    worwhere,显示回溯 
    dordown,下山1帧回溯 
    uorup,上升1帧回溯 
    回车,重复最后一个命令 
    几乎任何东西,评估当前帧的Python代码(还有其他几个命令) 
    Garfielt
    Garfielt
    翻译于 10个月前

    0人顶

     

     翻译的不错哦!

    更棒的 PDB

    可以替代pdb的:

    • ipdb (easy_install ipdb) - 像 ipython (自动补齐, 颜色等)
    • pudb (easy_install pudb) - 基于curses (类gui), 浏览源码有很好的表现。

    远程 PDB

    1 sudo apt-get install winpdb

    替代 pdb.set_trace():

    1 import rpdb2
    2 rpdb2.start_embedded_debugger("secretpassword")

    现在运行Winpdb , 输入密码 到 File > Attach。

    不喜欢 Winpdb ? 只要通过 TCP运行 PDB

    使用下面代码:

    01 import loggging
    02  
    03 class Rdb(pdb.Pdb):
    04     """
    05     This will run pdb as a ephemeral telnet service. Once you connect no one
    06     else can connect. On construction this object will block execution till a
    07     client has connected.
    08  
    09     Based on https://github.com/tamentis/rpdb I think ...
    10  
    11     To use this::
    12  
    13         Rdb(4444).set_trace()
    14  
    15     Then run: telnet 127.0.0.1 4444
    16     """
    17     def __init__(self, port=0):
    18         self.old_stdout = sys.stdout
    19         self.old_stdin = sys.stdin
    20         self.listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    21         self.listen_socket.bind(('0.0.0.0', port))
    22         if not port:
    23             logging.critical("PDB remote session open on: %s"self.listen_socket.getsockname())
    24             print>> sys.__stderr__, "PDB remote session open on:"self.listen_socket.getsockname()
    25             sys.stderr.flush()
    26         self.listen_socket.listen(1)
    27         self.connected_socket, address = self.listen_socket.accept()
    28         self.handle = self.connected_socket.makefile('rw')
    29         pdb.Pdb.__init__(self, completekey='tab', stdin=self.handle, stdout=self.handle)
    30         sys.stdout = sys.stdin = self.handle
    31  
    32     def do_continue(self, arg):
    33         sys.stdout = self.old_stdout
    34         sys.stdin = self.old_stdin
    35         self.handle.close()
    36         self.connected_socket.close()
    37         self.listen_socket.close()
    38         self.set_continue()
    39         return 1
    40  
    41     do_c = do_cont = do_continue
    42  
    43 def set_trace():
    44     """
    45     Opens a remote PDB on first available port.
    46     """
    47     rdb = Rdb()
    48     rdb.set_trace()

    想要 REPL ? IPython 怎么样?

    如果你不需要一个整体的调试器,只要启动IPython用下面的代码:

    1 import IPython
    2 IPython.embed()
    蒋锴
    蒋锴
    翻译于 10个月前

    1人顶

     

     翻译的不错哦!

    其它翻译版本(1)

    标准Linux工具

    他们未被充分利用很令我惊讶。通过这些工具集你能弄清楚诸如这些的很多问题:从性能问题(太多的系统调用,内存分配等)到死锁,网络,磁盘等问题。

    1 sudo apt-get install htop
    2 sudo htop

    最有用的是降权运行strace,只需运行速冻 strace -P 12345 或strace-f 命令参数(-f表示strace分支进程)。 通常有很多的输出,你最好将输出重定向输出到一个文件(命令后添加 &> 文件名)来进行更深入的分析。

    然后就是ltrace,它和strace相似不过是通过库调用的,参数基本相同。

    lsof可以提供 你看过ltrace/ strace的处理号,这样使用:lsof -P 12345 

    Garfielt
    Garfielt
    翻译于 10个月前

    0人顶

     

     翻译的不错哦!

    让跟踪更深点

    它很容易使用以及可以做很多事,前提是大家都已经安装了htop!

    现在,找你所想的进程,仅仅需要按:

    • s  显示系统调用跟踪(strace)
    • L  显示库调用跟踪(ltrace)
    • l   显示lsof
    监视

    没有更好的替代品了,服务器持续监视,你曾经是否发现自己使用奇奇怪怪的跟踪方法去找出为什么哪里慢了以及资源怎么被消耗了,那么不要再被iotop, iftop, htop, iostat, vmstat等等烦扰了,赶快使用dstat吧,它可以做大多数上述的提到的工具能做的,而且可以做得更好!

    它会以紧凑,时尚的代码着色(亲,不像iostat, vmstat哟)持续显示你的数据,而且你可以一直看到以往的数据(与iftop, iotop, htop不同哟)。

    仅仅运行这个:

    1 dstat --cpu --io --mem --net --load --fs --vm --disk-util --disk-tps --freespace --swap --top-io --top-bio-adv
    还有一点就是这里还有更简单的方式来写哟,如shell历史记录(shell history)或则重命名命令(aliases)
    Lesus
    Lesus
    翻译于 10个月前

    0人顶

     

     翻译的不错哦!

    GDB

    这是一个相当复杂和强大的工具,但我仅仅涉及到基础的东西(设置和基本命令)。

    1 sudo apt-get install gdb python-dbg
    2 zcat /usr/share/doc/python2.7/gdbinit.gz > ~/.gdbinit
    3 run app with python2.7-dbg
    4 sudo gdb -p 12345
    现在请使用:
    • bt- 堆栈轨迹(C 级)
    • pystack- python 堆栈轨迹,前提是你需要拥有~/.gdbinit 并使用python-dbg
    • c(继续)

    有出现 segfaults 么 ?用 faulthandler !

    除了Python 3.3其他的都会出现这个可怕的错误, 回到Python 2.x

    只要按照下面来做,你至少会找到一条导致段错误的原因。

    1 >>> import faulthandler
    2 >>> faulthandler.enable()
    媛媛小译
    媛媛小译
    翻译于 10个月前

    0人顶

     

     翻译的不错哦!

    内存泄露

    好的,这里有许多工具,其中有一些是专门用于WSGI 应用的,像Dozer,但是我最喜欢的无疑是 objgraph。它是如此惊人的方便和易于使用。它没有与WSGI或任何其他东西继承,所以你需要找到你自己的方式来运行以下代码:

    1 >>> import objgraph
    2 >>> objs = objgraph.by_type("Request")[:15]
    3 >>> objgraph.show_backrefs(objs, max_depth=20, highlight=lambda v: v inobjs, filename="/tmp/graph.png")
    4 Graph written to /tmp/objgraph-zbdM4z.dot (107 nodes)
    5 Image generated as /tmp/graph.png
    你会得到一个像 这样的图表(警告:这个图表非常大)。你也会得到 dot输出。
    媛媛小译
    媛媛小译
    翻译于 10个月前

    0人顶

     

     翻译的不错哦!

    其它翻译版本(1)

    内存利用

    有时你想使用更少的内存。少分配内存通常会使程序运行的更快更好,用户们都喜欢精益求精:)

    有许多工具可以拿来使用 [1] ,但在我看来最好的是pytracemalloc - 与其他工具相比较,它的开销很小(不需要依赖于削弱速度的 sys.settrace)并且它的输出非常详尽。令人头疼的是它的配置,因为需要你重编译python,但是spt使其很容易做到。

    只要运行以下命令,然后你就可以去买午餐或者做其他事了:

    1 apt-get source python2.7 cd python2.7-*
    2 wget https://github.com/wyplay/pytracemalloc/raw/master/python2.7_track_free_list.patch
    3 patch -p1 < python2.7_track_free_list.patch
    4 debuild -us -uc cd ..
    5 sudo dpkg -i python2.7-minimal_2.7*.deb python2.7-dev_*.deb
    然后安装pytracemalloc(请注意:如果你是在虚拟环境中做的这些操作,那么在python重新安装后,你需要重建它-仅运行virtualenv myenv即可):
    1 pip install pytracemalloc

    现在,你就可以通过以下代码来封装你的应用程序:

    01 import tracemalloc, time
    02 tracemalloc.enable()
    03 top = tracemalloc.DisplayTop(
    04     5000# log the top 5000 locations
    05     file=open('/tmp/memory-profile-%s' % time.time(), "w")
    06 )
    07 top.show_lineno = True
    08 try:
    09     # code that needs to be traced
    10 finally:
    11     top.display()
    会得到像下面这样的输出:
    01 2013-05-31 18:05:07: Top 5000 allocations per file and line
    02 #1: .../site-packages/billiard/_connection.py:198: size=1288 KiB, count=70 (+0), average=18 KiB
    03 #2: .../site-packages/billiard/_connection.py:199: size=1288 KiB, count=70 (+0), average=18 KiB
    04 #3: .../python2.7/importlib/__init__.py:37: size=459 KiB, count=5958 (+0), average=78 B
    05 #4: .../site-packages/amqp/transport.py:232: size=217 KiB, count=6960 (+0), average=32 B
    06 #5: .../site-packages/amqp/transport.py:231: size=206 KiB, count=8798 (+0), average=24 B
    07 #6: .../site-packages/amqp/serialization.py:210: size=199 KiB, count=822 (+0), average=248 B
    08 #7: .../lib/python2.7/socket.py:224: size=179 KiB, count=5947 (+0), average=30 B
    09 #8: .../celery/utils/term.py:89: size=172 KiB, count=1953 (+0), average=90 B
    10 #9: .../site-packages/kombu/connection.py:281: size=153 KiB, count=2400 (+0), average=65 B
    11 #10: .../site-packages/amqp/serialization.py:462: size=147 KiB, count=4704 (+0), average=32 B
    12  
    13 ...
    漂亮吧?

    [1] https://github.com/wyplay/pytracemalloc#see-also

  • 相关阅读:
    《程序猿面试宝典3》大量错误(50+)纠正表
    STM32定时器的预装载寄存器与影子寄存器之间的关系【转】
    Linux虚拟内存和物理地址的理解【转】
    UNIX系统的显示时间何时会到尽头
    assert函数用法总结【转】
    Sizeof与Strlen的区别【转】
    C语言预处理器命令详解【转】
    C#预处理器指令【转】
    I2C总线信号时序总结【转】
    用状态机实现键盘消抖【转】
  • 原文地址:https://www.cnblogs.com/DjangoBlog/p/3725908.html
Copyright © 2011-2022 走看看