阿布云

你所需要的,不仅仅是一个好用的代理。

一些常用的 Python 调试工具(二)

阿布云 发表于

p1.png

标准linux工具

我常常惊讶于它们竟然远未被充分利用.你能用这些工具解决很大范围内的问题:从性能问题(太多的系统调用,内存分配等等)到死锁,网络问题,磁盘问题等等.
其中最有用的是最直接的strace,只需要运行 sudo strace -p 12345 或者 strace -f 指令(-f 即同时追踪fork出来的子进程),这就行了.输出一般会非常大,所以你可能想要把它重定向到一个文件以便作更多的分析(只需要加上 &> 文件名).

再就是ltrace,有点类似strace,不同的是,它输出的是库函数调用.参数大体相同.

还有lsof 用来指出你在ltrace/strace中看到的句柄数值的意义.比如:

1.png

 更好的跟踪

使用简单而可以做很多事情-人人都该装上htop!

2.png

现在找到那些你想要的进程,再输入:

3.png

监控

没 有好的持续的服务器监控,但是如果你曾遇到一些很诡异的情况,诸如为什么一切都运行的那么慢,那些系统资源都干什么去了,...等这些问题,想弄明白却又 无处下手之际,不必动用iotop、iftop、htop、iostat、vmstat这些工具,就用dstat吧!它可以做之前我们提过的大部分工作可 以做的事情,而且也许可以做的更好!
它会用一种紧凑的,代码高亮的方式(不同于iostat,vmstat)向你持续展示数据,你还经常可以看到过去的数据(不同于iftop、iostop、htop).

只需运行:

4.png

很可能有一种更简短的方式来写上面这条命令,

这是一个相当复杂而又强大的工具,但是这里我只提到了一些基本的内容(安装以及基础的命令)

5.png

用python2.7-dbg 运行程序:

6.png

现在使用:

7.png

发生段错误?用faulthandler !

python 3.3版本以后新增的一个很棒的功能,可以向后移植到python2.x版本.只需要运行下面的语句,你就可以大抵知道什么原因引起来段错误.

8.png

内存泄露

,这种情况下有很多的工具可以使用,其中有一些专门针对WSGI的程序比如Dozer,但是我最喜欢的当然是objgraph.使用简单方便,让人惊讶!
它没有集成WSGI或者其他,所以你需要自己去发现运行代码的方法,像下面这样:

9.png

10.png

你会得到像这样一张图(注意:它非常大).你也可以得到一张点输出.

内存使用

有时你想少用些内存.更少的内存分配常常可以使程序执行的更快,更好,用户希望内存合适好用)
有许多可用的工具,但在我看来最好用的是pytracemalloc.与其他工具相比,它开销非常小(不需要依赖于严重影响速度的sys.settrace)而且输出非常详尽.但安装起来比较痛苦,你需要重新编译python,但有了apt,做起来也非常容易.

只需要运行这些命令然后去吃顿午餐或者干点别的:

11.png

接着安装pytracemalloc (注意如果你在一个virtualenv虚拟环境下操作,你需要在重新安装python后再次重建 – 只需要运行 virtualenv myenv)

12.png

现在像下面这样在代码里包装你的应用程序

13.png

输出会像这样:

14.png

很美,不是吗?