1.什么是pdb?

  pdb是python提供的调试程序的一种工具。

2.为什么需要pdb模块?

  当我们的程序越写越大的时候,我们用print xxx 这种方式打断点,调试,非常不方便,这个时候我们需要专业的调试工具

3 如何使用pdb模块?

#!/usr/bin/env python
#coding:utf-8 import pdb def a():
print "this is a" def b():
print "this is b" def c():
print "this is c" def main():
pdb.set_trace()
a()
print "a is done"
print "---------------"
pdb.set_trace()
b()
print "b is done"
print "---------------"
pdb.set_trace()
c()
print "c is done"
print "--------------" main()

我们写了这样一个程序,在行首import了pdb模块

然后在需要打断点插入这么一行代码  pdb.set_trace(),然后我们在执行的时候就变成这样

root@SSS:/data/last/rebootMon/nbNet# python pdb_test.py
> /data/last/rebootMon/nbNet/pdb_test.py(18)main()
-> a()
(Pdb)

这个时候我们可以敲入对应指令,达到对应效果

n  --->  下一行:

 

 start
> /data/last/rebootMon/nbNet/pdb_test.py(19)main()
-> a()
(Pdb) n
this is a
> /data/last/rebootMon/nbNet/pdb_test.py(20)main()
-> print "a is done"
(Pdb) n
a is done
> /data/last/rebootMon/nbNet/pdb_test.py(21)main()
-> print "---------------"
(Pdb) n
---------------
> /data/last/rebootMon/nbNet/pdb_test.py(22)main()
-> pdb.set_trace()
(Pdb) n
> /data/last/rebootMon/nbNet/pdb_test.py(23)main()
-> b()
(Pdb) n
this is b
> /data/last/rebootMon/nbNet/pdb_test.py(24)main()
-> print "b is done"
(Pdb) n
b is done
> /data/last/rebootMon/nbNet/pdb_test.py(25)main()
-> print "---------------"
(Pdb) n
---------------
> /data/last/rebootMon/nbNet/pdb_test.py(26)main()
-> pdb.set_trace()
(Pdb) n
> /data/last/rebootMon/nbNet/pdb_test.py(27)main()
-> c()
(Pdb) n
this is c
> /data/last/rebootMon/nbNet/pdb_test.py(28)main()
-> print "c is done"
(Pdb) n
c is done
> /data/last/rebootMon/nbNet/pdb_test.py(29)main()
-> print "--------------"
(Pdb) n
--------------
--Return--

我们可以看到当代码执行到一个断点的位置就会阻塞住,然后我们每敲一次n都会往下执行一行代码。  

  p  --->  打印:

 假如我们程序是这样

#!/usr/bin/env python
#coding:utf-8 import pdb def a(msg):
print "this is %s",msg def b(msg):
print "this is %s"% msg def c(msg):
print "this is %s"%msg def main():
msg1 = 'a'
msg2 = 'b'
msg3 = 'c'
print "start"
pdb.set_trace()
a(msg1)
print "a is done"
print "---------------"
pdb.set_trace()
b(msg2)
print "b is done"
print "---------------"
pdb.set_trace()
c(msg3)
print "c is done"
print "--------------" main()

我们想打印变量的值,就可以这样

root@SSS:/data/last/rebootMon/nbNet# python pdb_test.py
start
> /data/last/rebootMon/nbNet/pdb_test.py(22)main()
-> a(msg1)
(Pdb) p msg1
'a'
(Pdb)

  l  ---> 展示:

  

root@SSS:/data/last/rebootMon/nbNet# python pdb_test.py
start
> /data/last/rebootMon/nbNet/pdb_test.py(22)main()
-> a(msg1)
(Pdb) l
17 msg1 = 'a'
18 msg2 = 'b'
19 msg3 = 'c'
20 print "start"
21 pdb.set_trace()
22 -> a(msg1)
23 print "a is done"
24 print "---------------"
25 pdb.set_trace()
26 b(msg2)
27 print "b is done"
(Pdb) n
this is %s a
> /data/last/rebootMon/nbNet/pdb_test.py(23)main()
-> print "a is done"
(Pdb) n
a is done
> /data/last/rebootMon/nbNet/pdb_test.py(24)main()
-> print "---------------"
(Pdb) l
19 msg3 = 'c'
20 print "start"
21 pdb.set_trace()
22 a(msg1)
23 print "a is done"
24 -> print "---------------"
25 pdb.set_trace()
26 b(msg2)
27 print "b is done"
28 print "---------------"
29 pdb.set_trace()

   b ---> 动态生成断点

我们先重写代码

#!/usr/bin/env python
#coding:utf-8 import pdb def a(msg):
print "this is %s",msg def b(msg):
print "this is %s"% msg def c(msg):
print "this is %s"%msg def main():
msg1 = 'a'
msg2 = 'b'
msg3 = 'c'
print "start"
while 1:
pdb.set_trace()
print "a is start"
a(msg1)
print "a is done"
print "---------------"
pdb.set_trace()
print "b is start"
b(msg2)
print "b is done"
print "---------------"
pdb.set_trace()
print "c is start"
c(msg3)
print "c is done"
print "--------------" main()
-> print "a is start"
(Pdb) l
18 msg2 = 'b'
19 msg3 = 'c'
20 print "start"
21 while 1:
22 pdb.set_trace()
23 -> print "a is start"
24 a(msg1)
25 print "a is done"
26 print "---------------"
27 pdb.set_trace()
28 print "b is start"
(Pdb) b 25
Breakpoint 1 at /data/last/rebootMon/nbNet/pdb_test.py:25
(Pdb) n
a is start
> /data/last/rebootMon/nbNet/pdb_test.py(24)main()
-> a(msg1)
(Pdb) n
this is %s a
> /data/last/rebootMon/nbNet/pdb_test.py(25)main()
-> print "a is done"
(Pdb) n
a is done
> /data/last/rebootMon/nbNet/pdb_test.py(26)main()
-> print "---------------"

我们 输入 b25 增加了一个断点

然后我们输入n 就跳到 25行。

q --退出:

  退出交互

---使用动态变量

(Pdb) !x = 123
(Pdb) p x
123

 

pdb在python程序中应用的更多相关文章

  1. 在Python程序中的进程操作,multiprocess.Process模块

    在python程序中的进程操作 之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起 ...

  2. python 全栈开发,Day38(在python程序中的进程操作,multiprocess.Process模块)

    昨日内容回顾 操作系统纸带打孔计算机批处理 —— 磁带 联机 脱机多道操作系统 —— 极大的提高了CPU的利用率 在计算机中 可以有超过一个进程 进程遇到IO的时候 切换给另外的进程使用CPU 数据隔 ...

  3. python程序中使用MySQL数据库

    目录 python程序中使用MySQL数据库 1 pymysql连接数据库 2 sql 注入 3 增删改查操作 4 pymysql使用总结 python程序中使用MySQL数据库 1.python中使 ...

  4. Python程序中的进程操作--—--开启多进程

    Python程序中的进程操作-----开启多进程 之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创 ...

  5. Python程序中的线程操作(线程池)-concurrent模块

    目录 Python程序中的线程操作(线程池)-concurrent模块 一.Python标准模块--concurrent.futures 二.介绍 三.基本方法 四.ProcessPoolExecut ...

  6. PDB调试Python程序

    pdb是python内置的调试工具, 它可以在终端中调试Python程序, 这允许pdb在很多无法安装IDE的服务器上使用. 虽然远程调试使用广泛, 但在必要的时候(比如难以在本地搭建运行环境)pdb ...

  7. python 程序中调用go

    虽然python优点很多,但是有一个致命的缺点就是运行速度太慢,那么python程序需要一些计算量比较大的模块时一般会调用c或者c++的代码来重写,但是c/c++编写代码代价太高,耗费太多的人力.那么 ...

  8. Python程序中的进程操作

    之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起来的python程序也是一个进程 ...

  9. 在Python程序中调用Java代码的实现

    <原创不易,转载请标明出处:https://www.cnblogs.com/bandaobudaoweng/p/10785766.html> 前言 开发Python程序,需求中需要用到Ja ...

随机推荐

  1. 表面积最小(POJ3536)

    题目链接:http://poj.org/problem?id=3536 在体积固定的情况下,表面积最小时的长,宽,高. 这里枚举长,宽,根据体积计算高. #include <iostream&g ...

  2. Python 数据驱动 unittest + ddt

    一数据驱动测试的含义: 在百度百科上的解释是: 数据驱动测试,即黑盒测试(Black-box Testing),又称为功能测试,是把测试对象看作一个黑盒子.利用黑盒测试法进行动态测试时,需要测试软件产 ...

  3. log4net为什么会打印两次?

    用“log4net 使用”做关键字在bing上搜索,点开排序第一的链接:http://33liuhongwei33.blog.163.com/blog/static/39923778201156101 ...

  4. Java8函数之旅 (二) --Java8中的流

    流与集合    众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...

  5. base64模块的使用及python中的使用

    Base64是一种基于64个可打印字符来表示二进制数据的表示方法.由于2^=,所以每6个比特为一个单元,对应某个可打印字符.3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字 ...

  6. ubuntu安装jdk6

    我的ubuntu版本是12.04的64位的.由于ubuntu官方没有更新最新版的jdk6,所以我们只能主动去oracle公司网站去下载.网站地址:http://www.oracle.com/techn ...

  7. 关于discuz 不能全文搜索的问题

    这个问题客服反馈很多次了,以为discuz 默认搜索只能搜标题,除非配置了sphinx全文搜索引擎. 但是之前比较老的员工说以前能用的,也就是discuz老版本. 今天突然想到是不是discuz纵横搜 ...

  8. 关于Ubuntu 16.04 pip安装Docker-Compose

    $ sudo apt-get update 安装pip: $ sudo apt-get install python-pip 卸载旧版本docker-compose: $ sudo pip unins ...

  9. IDEA的下载安装和激活

    1.下载网站http://www.jetbrains.com/ 2. 3. 4.注意要下载Ultimate版本 5.安装 下载完成后直接下一步,傻瓜式安装 6.激活,在图片位置输入激活码即可 !!!! ...

  10. java数组之二分法查找

    认识: 猜字游戏 步数 所猜的数 结果 可能值的范围 0     1~100 1 50 太高 1~49 2 25 太低 26~49 3 37 太高 26~36 4 31 太低 32~36 5 34 太 ...