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

日志

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

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

追踪有时看到程序如何被执行会很有帮助。你可以使用IDE的调试共轭ngn一步一步的运行程序,但你需要知道你要找的是什么,否则这将会是一个漫长的过程。

标准库中有一个 trace模块,可以打印所有执行过程中的内容(像制作 覆盖率报告)。

python -mtrace --trace script.py

这将产生大量输出(每个行会被打印输出,所以你最好通过管道,用grep只看自己感兴趣的部分),例如:

python -mtrace --trace script.py | egrep '^(mod1.py|mod2.py)'

-

如果你喜欢新特性,那么你可以尝试 smiley - 它可以显示变量内容变化,还可以用它来远程追踪程序。

PDB

import pdb

pdb.set_trace() # opens up pdb prompt

或者:

try:

code

that

fails

except:

import pdb

pdb.pm() # or pdb.post_mortem()

或(按键盘C键启动脚本):

python -mpdb script.py

像在REPL中那样:

c or continue

q or quit

l or list, 在当前界面显示源码

w or where, 显示回溯

d or down, 显示回溯的下一界面

u or up, 显示回溯的上一界面

, 重复最后一个命令

其他任何东西,在当前界面评估源码 (t还有其他的一些命令)

corcontinue

qorquit

lorlist,显示在当前帧的源

worwhere,显示回溯

dordown,下山1帧回溯

uorup,上升1帧回溯

回车,重复最后一个命令

几乎任何东西,评估当前帧的Python代码(还有其他几个命令)

可以替代pdb的:

ipdb (easy_install ipdb) - 像 ipython (自动补齐, 颜色等)

pudb (easy_install pudb) - 基于curses (类gui), 浏览源码有很好的表现。

远程 PDB

sudo apt-get install winpdb

替代 pdb.set_trace():

import rpdb2

rpdb2.start_embedded_debugger("secretpassword")

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

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

使用下面代码:

import loggging

class Rdb(pdb.Pdb):

"""

This will run pdb as a ephemeral telnet service. Once you connect no one

else can connect. On construction this object will block execution till a

client has connected.

Based on https://github.com/tamentis/rpdb I think ...

To use this::

Rdb(4444).set_trace()

Then run: telnet 127.0.0.1 4444

"""

def __init__(self, port=0):

self.old_stdout = sys.stdout

self.old_stdin = sys.stdin

self.listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

self.listen_socket.bind(('0.0.0.0', port))

if not port:

logging.critical("PDB remote session open on: %s", self.listen_socket.getsockname())

print >> sys.__stderr__, "PDB remote session open on:", self.listen_socket.getsockname()

sys.stderr.flush()

self.listen_socket.listen(1)

self.connected_socket, address = self.listen_socket.accept()

self.handle = self.connected_socket.makefile('rw')

pdb.Pdb.__init__(self, completekey='tab', stdin=self.handle, stdout=self.handle)

sys.stdout = sys.stdin = self.handle

def do_continue(self, arg):

sys.stdout = self.old_stdout

sys.stdin = self.old_stdin

self.handle.close()

self.connected_socket.close()

self.listen_socket.close()

self.set_continue()

return 1

do_c = do_cont = do_continue

def set_trace():

"""

Opens a remote PDB on first available port.

"""

rdb = Rdb()

rdb.set_trace()

想要 REPL ? IPython 怎么样?

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

import IPython

IPython.embed()

标准Linux工具

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

sudo apt-get install htop

sudo htop

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

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

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

让跟踪更深点

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

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

s 显示系统调用跟踪(strace)

L 显示库调用跟踪(ltrace)

l 显示lsof

监视

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

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

仅仅运行这个:

dstat --cpu --io --mem --net --load --fs --vm --disk-util --disk-tps --freespace --swap --top-io --top-bio-adv

还有一点就是这里还有更简单的方式来写哟,如shell历史记录(shell history)或则重命名命令(aliases)

GDB

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

sudo apt-get install gdb python-dbg

zcat /usr/share/doc/python2.7/gdbinit.gz > ~/.gdbinit

run app with python2.7-dbg

sudo gdb -p 12345

现在请使用:

bt- 堆栈轨迹(C 级)

pystack- python 堆栈轨迹,前提是你需要拥有~/.gdbinit 并使用python-dbg

c(继续)

有出现 segfaults 么 ?用 faulthandler !

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

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

>>> import faulthandler

>>> faulthandler.enable()

内存泄露

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

>>> import objgraph

>>> objs = objgraph.by_type("Request")[:15]

>>> objgraph.show_backrefs(objs, max_depth=20, highlight=lambda v: v in objs, filename="/tmp/graph.png")

Graph written to /tmp/objgraph-zbdM4z.dot (107 nodes)

Image generated as /tmp/graph.png

你会得到一个像 这样的图表(警告:这个图表非常大)。你也会得到 dot输出。

内存利用

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

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

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

apt-get source python2.7 cd python2.7-*

wget https://github.com/wyplay/pytracemalloc/raw/master/python2.7_track_free_list.patch

patch -p1 < python2.7_track_free_list.patch

debuild -us -uc cd ..

sudo dpkg -i python2.7-minimal_2.7*.deb python2.7-dev_*.deb

然后安装pytracemalloc(请注意:如果你是在虚拟环境中做的这些操作,那么在python重新安装后,你需要重建它-仅运行virtualenv myenv即可):

pip install pytracemalloc

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

import tracemalloc, time

tracemalloc.enable()

top = tracemalloc.DisplayTop(

5000, # log the top 5000 locations

file=open('/tmp/memory-profile-%s' % time.time(), "w")

)

top.show_lineno = True

try:

# code that needs to be traced

finally:

top.display()

会得到像下面这样的输出:

2013-05-31 18:05:07: Top 5000 allocations per file and line

#1: .../site-packages/billiard/_connection.py:198: size=1288 KiB, count=70 (+0), average=18 KiB

#2: .../site-packages/billiard/_connection.py:199: size=1288 KiB, count=70 (+0), average=18 KiB

#3: .../python2.7/importlib/__init__.py:37: size=459 KiB, count=5958 (+0), average=78 B

#4: .../site-packages/amqp/transport.py:232: size=217 KiB, count=6960 (+0), average=32 B

#5: .../site-packages/amqp/transport.py:231: size=206 KiB, count=8798 (+0), average=24 B

#6: .../site-packages/amqp/serialization.py:210: size=199 KiB, count=822 (+0), average=248 B

#7: .../lib/python2.7/socket.py:224: size=179 KiB, count=5947 (+0), average=30 B

#8: .../celery/utils/term.py:89: size=172 KiB, count=1953 (+0), average=90 B

#9: .../site-packages/kombu/connection.py:281: size=153 KiB, count=2400 (+0), average=65 B

#10: .../site-packages/amqp/serialization.py:462: size=147 KiB, count=4704 (+0), average=32 B

...

python手机编程调试_在Linux下调试Python代码的各种方法相关推荐

  1. python导入数据画柱状图代码_在Linux下使用Python的matplotlib绘制数据图的教程

    如果你想要在Linxu中获得一个高效.自动化.高质量的科学画图的解决方案,应该考虑尝试下matplotlib库.Matplotlib是基于python的开源科学测绘包,基于python软件基金会许可证 ...

  2. python windows编程_在Windows下配置Python编程学习环境

    一.需求: 之前是在Linux环境下进行Python的学习,每次开虚拟机觉得有点麻烦,希望可以直接在Windows的dos命令行下进行Python编程学习. 二.安装软件 直接从官网下载这两个软件安装 ...

  3. emacs python开发环境_配置Emacs下的Python开发环境

    特性 在Linux论坛上总有人问Python用什么IDE比较好,然后总会有人回答说Emacs.最近开始学Python,也花了点时间研究怎么配置Emacs,发现没有想象中的那么麻烦.这篇文章大致上来自于 ...

  4. linux运行python脚本语句,如何在Linux下运行Python脚本

    1.使用python的IDEL运行python 如果你的Linux安装了python,Ctrl+Alt+T打开Terminal后输入指令:python,会出现>>>,这个时候就可以在 ...

  5. linux如何调试脚本文件目录,如何在Linux下调试Bash Shell脚本的方法

    新手写了一个 hello world 小脚本,如何能调试运行在 Linux 或者类 UNIX 的系统上的 bash shell 脚本呢? 这是 Linux / Unix 系统管理员或新用户最常问的问题 ...

  6. Linux下调试python

    原文地址:http://www.cnblogs.com/chinasun021/archive/2013/03/19/2969107.html 先找了段简单的测试程序: 复制代码 !/usr/bin/ ...

  7. python手机话费_查询话费订单详情示例代码

    #!/usr/bin/python # encoding:utf-8 import urllib2, json, urllib, hashlib # 3.获取订单详情 data = {} data[& ...

  8. python __repr__用法_如何使用repr调试python程序

    一般调试程序的时候都比较倾向print,利用直接打印的方法作出判断,但是print只能打印出结果,对类型无法作出判断.例如: 复制代码 a = 5 b = '5' print(a) print(b) ...

  9. linux 升级python 3.5,Linux下升级Python到3.5.2版本

    本文主要介绍在Linux(CentOS)下将Python的版本升级为3.5.2的方法 众所周知,在2020年python官方将不再支持2.7版本的python,所以使用3.x版本的python是必要的 ...

最新文章

  1. 从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码
  2. 隐藏SSID无线网络ID 你的无线网络真的安全吗?
  3. java中高级大公司多线程面试题
  4. WINCC中使用ADO对象连接数据库 例子 常用属性 方法 原创
  5. Python学习(七)面向对象 ——封装
  6. 人工智能和Adobe Sensei
  7. arrayrand php,php中array_rand函数的功能起什么作用呢?
  8. 聊聊spring的ioc
  9. Android零基础入门第87节:Fragment添加、删除、替换
  10. 原来PC界面临洗牌的背后原因是因为存储
  11. bzoj 1009: [HNOI2008]GT考试(dp+kmp+矩阵快速幂)
  12. web前端入门笔记:JSON
  13. 异常值检测——绝对中位差MAD(median absolute deviation )
  14. 异常处理1:复习、异常概述和异常体系结构
  15. FANUC机器人奇异点的解决方法
  16. 华为-交换机堆叠配置
  17. React 中使用 render props
  18. 微信小程序getUserInfo无法获取用户信息
  19. 重押农业,拼多多正在扛起乡村振兴大旗
  20. [console] early printk实现流程

热门文章

  1. vue3+ts+vant移动端H5项目搭建
  2. mysql远程连接3306不通问题
  3. 从虚拟化前端Bug学习分析Kernel Dump
  4. 部落冲突-建筑大师基地军队建筑介绍(兵营、建筑大师训练营、星空实验室、战争机器)
  5. oracle会闪,Oracle闪来操作
  6. 剪映导出帧率选多少_剪映帧率|剪映帧率是什么 剪映帧率在哪设置_234游戏网
  7. QT HTTP接收多个数据包生成图片
  8. Codeforces Round #828B CF1744B Even-Odd Increments
  9. 迅雷超级会员有必要开吗,迅雷超级会员值得开吗
  10. QT安装我i发下载存档问题解决