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. poj 3485 区间选点

    题目链接:http://poj.org/problem?id=3485 题意:X轴上公路从0到L,X轴上下有一些点给出坐标代表村庄,问在公路上最少建几个出口才能使每个村庄到出口的距离不超过D. 以村庄 ...

  2. jade简介

    模板引擎:将动静部分糅合的一种实现机制或者技术 var items = [ {title:'..',photo:'http://',id:1,desc:'a'}, {title:'..',photo: ...

  3. Java连接mysql中遇到的一些问题及解决方法

    1.Java使用mysql-jdbc连接MySQL出现如下警告: Establishing SSL connection without server's identityverification i ...

  4. MySQL游标(cursor) 定义及使用

    概念 游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集. 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式. 用SQL语言从数据库中检索数据后,结果 ...

  5. mayan 游戏真是毒瘤

    如题 真坑呀!!! 可算过了 我率先达到了氧气富有化 先是改变时没有fall.40分 然后是fall函数写慢了 tle 50分 . 上代码 #include<cstdio> #includ ...

  6. 第34章 IWDG—独立看门狗—零死角玩转STM32-F429系列

    第34章     IWDG—独立看门狗 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...

  7. jQuery选择器与事件学习笔记

    层次选择器:  $("div li")获取div下的所有li元素(后代.子.子的子......)  $("div>li")获取div下的直接li子元素.  ...

  8. Json数据常用操作

    JSON字符串: var str1 = '{ "name": "cs", "sex": "man" }'; JSON对象 ...

  9. 利用deadline_timer实现定时器Timer

    // 类似QTimer的定时器 class Timer { typedef void(* handler)(); public: Timer() : m_millseconds() , m_timer ...

  10. 【杂题总汇】NOIP2013(洛谷P1967) 货车运输

    [洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...