• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >python > 在Linux下调试Python代码的各种方法

在Linux下调试Python代码的各种方法

作者:goldensun 字体:[增加 减小] 来源:互联网

goldensun 通过本文主要向大家介绍了python linux,linux安装python2.7,linux下安装python,linux安装python3.5,linux安装python3等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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

日志

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

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

追踪
有时看到程序如何被执行会很有帮助。你可以使用IDE的调试共轭ngn一步一步的运行程序,但你需要知道你要找的是什么,否则这将会是一个漫长的过程。
标准库中有一个 trace模块,可以打印所有执行过程中的内容(像制作 覆盖率报告)。
 

python -mtrace --trace script.py
</div>

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

python -mtrace --trace script.py | egrep '^(mod1.py|mod2.py)'
- 
</div>

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

PDB
 

import pdb
pdb.set_trace() # opens up pdb prompt
</div>

或者:
 

try:
  code
  that
  fails
except:
  import pdb
  pdb.pm() # or pdb.post_mortem()
</div>

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

python -mpdb script.py
</div>

像在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代码(还有其他几个命令)

可以替代pdb的:

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

远程 PDB
 

sudo apt-get install winpdb
</div>

替代 pdb.set_trace():
 

import rpdb2
rpdb2.start_embedded_debugger("secretpassword")
</div>

现在运行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()
</div>

想要 REPL ? IPython 怎么样?

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

import IPython
IPython.embed()
</div>

标准Linux工具

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

sudo apt-get install htop
sudo htop
</div>

最有用的是降权运行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
</div>

还有一点就是这里还有更简单的方式来写哟,如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
</div>

现在请使用:

    bt- 堆栈轨迹(C 级)
    pystack- python 堆栈轨迹,前提是你需要拥有~/.gdbinit 并使用python-dbg
    c(继续)

有出现 segfaults 么 ?用 faulthandler !

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

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

>>> import faulthandler
>>> faulthandler.enable()
</div>

内存泄露

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

>>> import objgrap
  


 

您可能想查找下面的文章:

  • Linux下为不同版本python安装第三方库
  • Python利用IPython提高开发效率
  • Python彩色化Linux的命令行终端界面的代码实例分享
  • Linux中安装Python的交互式解释器IPython的教程
  • Linux中Python 环境软件包安装步骤
  • linux下python抓屏实现方法
  • Python中IPYTHON入门实例
  • 在Linux下调试Python代码的各种方法
  • 使用IPython来操作Docker容器的入门指引
  • 使用IPython来操作Docker容器的入门指引

相关文章

  • python获取文件版本信息、公司名和产品名的方法
  • 使用Python实现BT种子和磁力链接的相互转换
  • Python删除windows垃圾文件的方法
  • python 运算符 供重载参考
  • python执行等待程序直到第二天零点的方法
  • Python ftp上传文件
  • python实现指定字符串补全空格的方法
  • Python中使用copy模块实现列表(list)拷贝
  • Python yield使用方法示例
  • 简单的连接MySQL与Python的Bottle框架的方法

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • 深入源码解析Python中的对象与类型
    • 实例探究Python以并发方式编写高性能端口扫描器的方法
    • 详解Python中for循环的使用方法
    • Python环境下安装使用异步任务队列包Celery的基础教程
    • Python中为什么要用self探讨
    • SublimeText 2编译python出错的解决方法(The system cannot find the file specified)
    • 深入讲解Python函数中参数的使用及默认参数的陷阱
    • Python中for循环和while循环的基本使用方法
    • Python用模块pytz来转换时区
    • python读取浮点数和读取文本文件示例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有