展开全部

使用 pdb 进行调试

pdb 是 python 自带e5a48de588b662616964757a686964616f31333361306366的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。pdb 提供了一些常用的调试命令,详情见表 1。

表 1. pdb 常用命令

命令

解释

break 或 b 设置断点

设置断点

continue 或 c

继续执行程序

list 或 l

查看当前行的代码段

step 或 s

进入函数

return 或 r

执行代码直到从当前函数返回

exit 或 q

中止并退出

next 或 n

执行下一行

pp

打印变量的值

help

帮助

下面结合具体的实例讲述如何使用 pdb 进行调试。

清单 1. 测试代码示例

import pdb

a = "aaa"

pdb.set_trace()

b = "bbb"

c = "ccc"

final = a + b + c

print final

开始调试:直接运行脚本,会停留在 pdb.set_trace() 处,选择 n+enter 可以执行当前的 statement。在第一次按下了 n+enter 之后可以直接按 enter 表示重复执行上一条 debug 命令。

清单 2. 利用 pdb 调试

[root@rcc-pok-idg-2255 ~]# python epdb1.py

> /root/epdb1.py(4)?()

-> b = "bbb"

(Pdb) n

> /root/epdb1.py(5)?()

-> c = "ccc"

(Pdb)

> /root/epdb1.py(6)?()

-> final = a + b + c

(Pdb) list

1 import pdb

2 a = "aaa"

3 pdb.set_trace()

4 b = "bbb"

5 c = "ccc"

6 -> final = a + b + c

7 print final

[EOF]

(Pdb)

[EOF]

(Pdb) n

> /root/epdb1.py(7)?()

-> print final

(Pdb)

退出 debug:使用 quit 或者 q 可以退出当前的 debug,但是 quit 会以一种非常粗鲁的方式退出程序,其结果是直接 crash。

清单 3. 退出 debug

[root@rcc-pok-idg-2255 ~]# python epdb1.py

> /root/epdb1.py(4)?()

-> b = "bbb"

(Pdb) n

> /root/epdb1.py(5)?()

-> c = "ccc"

(Pdb) q

Traceback (most recent call last):

File "epdb1.py", line 5, in ?

c = "ccc"

File "epdb1.py", line 5, in ?

c = "ccc"

File "/usr/lib64/python2.4/bdb.py", line 48, in trace_dispatch

return self.dispatch_line(frame)

File "/usr/lib64/python2.4/bdb.py", line 67, in dispatch_line

if self.quitting: raise BdbQuit

bdb.BdbQuit

打印变量的值:如果需要在调试过程中打印变量的值,可以直接使用 p

加上变量名,但是需要注意的是打印仅仅在当前的 statement 已经被执行了之后才能看到具体的值,否则会报 NameError: <

exceptions.NameError … ....> 错误。

清单 4. debug 过程中打印变量

[root@rcc-pok-idg-2255 ~]# python epdb1.py

> /root/epdb1.py(4)?()

-> b = "bbb"

(Pdb) n

> /root/epdb1.py(5)?()

-> c = "ccc"

(Pdb) p b

'bbb'

(Pdb)

'bbb'

(Pdb) n

> /root/epdb1.py(6)?()

-> final = a + b + c

(Pdb) p c

'ccc'

(Pdb) p final

*** NameError:

(Pdb) n

> /root/epdb1.py(7)?()

-> print final

(Pdb) p final

'aaabbbccc'

(Pdb)

使用 c 可以停止当前的 debug 使程序继续执行。如果在下面的程序中继续有 set_statement() 的申明,则又会重新进入到 debug 的状态,读者可以在代码 print final 之前再加上 set_trace() 验证。

清单 5. 停止 debug 继续执行程序

[root@rcc-pok-idg-2255 ~]# python epdb1.py

> /root/epdb1.py(4)?()

-> b = "bbb"

(Pdb) n

> /root/epdb1.py(5)?()

-> c = "ccc"

(Pdb) c

aaabbbccc

显示代码:在 debug 的时候不一定能记住当前的代码块,如要要查看具体的代码块,则可以通过使用 list 或者 l 命令显示。list 会用箭头 -> 指向当前 debug 的语句。

清单 6. debug 过程中显示代码

[root@rcc-pok-idg-2255 ~]# python epdb1.py

> /root/epdb1.py(4)?()

-> b = "bbb"

(Pdb) list

1 import pdb

2 a = "aaa"

3 pdb.set_trace()

4 -> b = "bbb"

5 c = "ccc"

6 final = a + b + c

7 pdb.set_trace()

8 print final

[EOF]

(Pdb) c

> /root/epdb1.py(8)?()

-> print final

(Pdb) list

3 pdb.set_trace()

4 b = "bbb"

5 c = "ccc"

6 final = a + b + c

7 pdb.set_trace()

8 -> print final

[EOF]

(Pdb)

在使用函数的情况下进行 debug

清单 7. 使用函数的例子

import pdb

def combine(s1,s2): # define subroutine combine, which...

s3 = s1 + s2 + s1 # sandwiches s2 between copies of s1, ...

s3 = '"' + s3 +'"' # encloses it in double quotes,...

return s3 # and returns it.

a = "aaa"

pdb.set_trace()

b = "bbb"

c = "ccc"

final = combine(a,b)

print final

如果直接使用 n 进行 debug 则到 final=combine(a,b)

这句的时候会将其当做普通的赋值语句处理,进入到 print final。如果想要对函数进行 debug 如何处理呢 ? 可以直接使用 s

进入函数块。函数里面的单步调试与上面的介绍类似。如果不想在函数里单步调试可以在断点处直接按 r 退出到调用的地方。

清单 8. 对函数进行 debug

[root@rcc-pok-idg-2255 ~]# python epdb2.py

> /root/epdb2.py(10)?()

-> b = "bbb"

(Pdb) n

> /root/epdb2.py(11)?()

-> c = "ccc"

(Pdb) n

> /root/epdb2.py(12)?()

-> final = combine(a,b)

(Pdb) s

--Call--

> /root/epdb2.py(3)combine()

-> def combine(s1,s2): # define subroutine combine, which...

(Pdb) n

> /root/epdb2.py(4)combine()

-> s3 = s1 + s2 + s1 # sandwiches s2 between copies of s1, ...

(Pdb) list

1 import pdb

2

3 def combine(s1,s2): # define subroutine combine, which...

4 -> s3 = s1 + s2 + s1 # sandwiches s2 between copies of s1, ...

5 s3 = '"' + s3 +'"' # encloses it in double quotes,...

6 return s3 # and returns it.

7

8 a = "aaa"

9 pdb.set_trace()

10 b = "bbb"

11 c = "ccc"

(Pdb) n

> /root/epdb2.py(5)combine()

-> s3 = '"' + s3 +'"' # encloses it in double quotes,...

(Pdb) n

> /root/epdb2.py(6)combine()

-> return s3 # and returns it.

(Pdb) n

--Return--

> /root/epdb2.py(6)combine()->'"aaabbbaaa"'

-> return s3 # and returns it.

(Pdb) n

> /root/epdb2.py(13)?()

-> print final

(Pdb)

在调试的时候动态改变值 。在调试的时候可以动态改变变量的值,具体如下实例。需要注意的是下面有个错误,原因是 b 已经被赋值了,如果想重新改变 b 的赋值,则应该使用! B。

清单 9. 在调试的时候动态改变值

[root@rcc-pok-idg-2255 ~]# python epdb2.py

> /root/epdb2.py(10)?()

-> b = "bbb"

(Pdb) var = "1234"

(Pdb) b = "avfe"

*** The specified object '= "avfe"' is not a function

or was not found along sys.path.

(Pdb) !b="afdfd"

(Pdb)

pdb

调试有个明显的缺陷就是对于多线程,远程调试等支持得不够好,同时没有较为直观的界面显示,不太适合大型的 python 项目。而在较大的

python 项目中,这些调试需求比较常见,因此需要使用更为高级的调试工具。接下来将介绍 PyCharm IDE 的调试方法 .

本回答由网友推荐

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

python怎么打日志_怎样调试 日志 python 代码相关推荐

  1. potainer 日志_实时Web日志分析神器

    GoAccess 是什么? GoAccess 是一个开源的实时Web日志分析器和交互式查看器,可在*nix系统上的终端或通过浏览器运行.它为系统管理员提供了实时而有价值的HTTP统计信息. GoAcc ...

  2. 实现打印异常日志_老生常谈SpringAop日志收集与处理做的工具包

    场景 : 使用Spring Aop拦截参数日志目前大部分做法都基本上大同小异,不想日后每个项目工程都写一份这样的Aop拦截处理日志的代码,甚至代码侵入. 我想知道一些相对重要的请求方法的请求参数,响应 ...

  3. 清空数据库事务日志_通过事务日志增长加快数据库恢复和长期运行的事务

    清空数据库事务日志 In my previous article in this series Accelerated Database Recovery; Instant Rollback and ...

  4. python游戏按键无效_瞬速掌握Python系统管理-调试和分析脚本1-debugging

    调试和分析在Python开发中发挥着重要作用. 调试器可帮助程序员分析完整的代码. 调试器设置断点,而剖析器运行我们的代码,并给我们执行时间的详细信息. 分析器将识别程序中的瓶颈.我们将了解pdb P ...

  5. java 可视化系统操作日志_技术文 | 日志框架使用技巧分享

    原标题:技术文 | 日志框架使用技巧分享 日志的意义 对于一个应用程序来说日志记录是具有重要意义的. 日志通常用于线上问题追踪,协助定位业务问题或程序问题,以及基于日志的业务逻辑统计分析等. java ...

  6. python描述器 有限状态机_笨办法学 Python · 续 练习 30:有限状态机

    练习 30:有限状态机 每当你阅读一本关于解析的书,都有一个可怕的章节,关于有限状态机(FSM).他们对"边"和"节点"进行了详细的分析,每个可能的" ...

  7. python语言运行效率高_如何评价说PYTHON是最快的语言?

    我是视频的作者,首先感谢朋友们的关注,并且诞生了这个论题,让我可以看到大家对我视频中的观点的反馈.对于大家的讨论,在日常时间允许的条件下,我会尽量参与.下面就我目前已经看到的朋友们的评论,做一下展开. ...

  8. 我的python学习笔记全集_记录我的Python学习笔记

    不想再像以前那样,什么都从头开始学习语法.总结语法,这样反而会过分纠结于语法,耽误了开发,毕竟语言的主要属性是工具,次要的属性是语言本身. 所以还是先熟练使用语言去进行开发,等足够熟悉了,再去研究语言 ...

  9. python定期自动运行_干货分享 | 适合 Python 入门的 8 款强大工具,不会就你还不知道吧!...

    点击上方"人工智能Corner","星标或置顶公众号" 干货分享,第一时间送达 Python是一种开源的编程语言,可用于Web编程.数据科学.人工智能以及许多科 ...

最新文章

  1. 计算机图形软件---图形功能
  2. C语言-动态内存分配总结
  3. shell实例第12讲:给定目录找出包含关键字的文件
  4. 本地虚拟机ceph 100.000% pgs not active
  5. word2vec原理_Word2vec详细整理(1)—权重更新原理
  6. 几种常用的优化方法梯度下降法、牛顿法、)
  7. java 星期几、得周一、得周日、上周、下周、相差、日期工具类
  8. 华尔街顶级大师胡立阳名言
  9. java中常见的包类接口_Java中一些常用的类,包,接口
  10. Java发送HTTP POST请求(内容为xml格式)
  11. vue+echarts 实时跟新数据 仪表盘多个渲染
  12. Atitit 薪酬管理法 工作手册 员:薪酬管理办法 1.薪酬结构 所有员工的薪酬均由岗位工资、级别工资、校龄工资、特别津贴、绩效工资和季度奖金六部分组成。其中岗位工资、级别工资、校龄工资、22
  13. .30-浅析webpack源码之doResolve事件流(2)
  14. js获取IP地址方法总结
  15. 记一次失败的 ThoughtWorks 面试经历
  16. 赛码网刷题python
  17. 什么是RESTful风格的API
  18. c语言小蜜蜂编程题,小蜜蜂 pascal程序
  19. 实数系基本定理证明第①波
  20. iOS关于图片点到像素转换之杂谈

热门文章

  1. 【正则表达式1】C++11正则表达式
  2. [c语言 ] 用libev 写个echo服务器
  3. 两种高性能I/O设计模式(Reactor/Proactor)的比较
  4. 机器学习经典论文/survey合集
  5. codeblock 显示 no such file(头文件)
  6. python绘制3d坐标轴_python – 尝试使用matplotlib更新3D图形坐标
  7. nacos 怎么配置 里的配置ip_Nacos-服务注册地址为内网IP的解决办法
  8. android 安装步骤
  9. python全栈开发 * 14 知识点汇总 * 180530
  10. windows下文件共享以及通过网线在两台Windows电脑之间传数据