学习python调试可参考官方文档的pdb.

一.python在调试模块添加pdb调试支持.

1
2
3
4

    import pdb; 
    pdb.set_trace()
 

不然,会遇见类似如下的错误

1
2
3
4
5
6
    (Pdb) n
    > /Users/ksnowlv/Documents/lvwei projects/python/thread_queue.py(38)<module>()
    -> nameList = ["One", "Two", "Three", "Four", "Five"]
    (Pdb) a
    (Pdb) p namelist
    *** NameError: NameError("name 'namelist' is not defined",)

二.常用命令

查看帮助

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    help
    (Pdb) 
    Documented commands (type help <topic>):
    ========================================
    EOF    bt         cont      enable  jump  pp       run      unt   
    a      c          continue  exit    l     q        s        until 
    alias  cl         d         h       list  quit     step     up    
    args   clear      debug     help    n     r        tbreak   w     
    b      commands   disable   ignore  next  restart  u        whatis
    break  condition  down      j       p     return   unalias  where 

解释如下:

    b/break  <linenumber>   #断点设置在本py的第linenumber行
    b/break  <functionname> #断点设置在本py的functionname
    b/break                 #列举当前所有的断点
    cl/clear                #清除所有断点
    cl/clear  <number>      #清除第number个断点 
    n/next        #单步运行到下一步
    s/step        #进入到函数内部
    c/continue    #继续运行
    p             #查看当前变量值
    l/list        #查看运行到某处代码
    a             #查看全部栈内变量
    w             #列出目前call stack 中的所在层
    d             #在call stack中往下移一层
    disable       #取消所有断点的功能,但仍然保留这些断点 
    enable        #恢复断点的功能  
    j/jump        #跳转到某行执行 
        

三.代码示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70

#!/usr/bin/python

import Queue
import threading
import time
import pdb; 
pdb.set_trace()

exitFlag = 0

class QThread (threading.Thread):

    "QThread class"
    def __init__(self, threadID, name, queue):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.queue = queue
    
    #线程函数
    def run(self):
        print "Starting " + self.name
        process_data(self.name, self.queue)
        print "Exiting " + self.name

#处理数据
def process_data(threadName, q):
    while not exitFlag:
        queueLock.acquire()
        if not workQueue.empty():
            data = q.get()
            queueLock.release()
            print "%s processing %s" % (threadName, data)
        else:
            queueLock.release()
        time.sleep(1)


threadList = ["ksnow", "kair", "baby"]
nameList = ["One", "Two", "Three", "Four", "Five"]
queueLock = threading.Lock()
workQueue = Queue.Queue(5)
threads = []
threadID = 1

# 创建新线程
for tName in threadList:
    thread = QThread(threadID, tName, workQueue)
    thread.start()
    threads.append(thread)
    threadID += 1

# 填充队列
queueLock.acquire()
for word in nameList:
    workQueue.put(word)
queueLock.release()

# 等待队列清空
while not workQueue.empty():
    pass

# 通知线程是时候退出
exitFlag = 1

# 等待所有线程完成
for t in threads:
    t.join()
print "Exiting Main Thread"

调试示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
    ksnowlv@ksnowlvdeMacBook-Pro~/Documents/lvwei projects/python$python thread_queue.py 
    > /Users/ksnowlv/Documents/lvwei projects/python/thread_queue.py(9)<module>()
    -> exitFlag = 0
    (Pdb) b process_data
    Breakpoint 1 at /Users/ksnowlv/Documents/lvwei projects/python/thread_queue.py:27
    (Pdb) b 45
    Breakpoint 2 at /Users/ksnowlv/Documents/lvwei projects/python/thread_queue.py:45
    (Pdb) b 33
    Breakpoint 3 at /Users/ksnowlv/Documents/lvwei projects/python/thread_queue.py:33
    (Pdb) b
    Num Type         Disp Enb   Where
    1   breakpoint   keep yes   at /Users/ksnowlv/Documents/lvwei projects/python/thread_queue.py:27
    2   breakpoint   keep yes   at /Users/ksnowlv/Documents/lvwei projects/python/thread_queue.py:45
    3   breakpoint   keep yes   at /Users/ksnowlv/Documents/lvwei projects/python/thread_queue.py:33
    (Pdb) cl 3
    Deleted breakpoint 3
    (Pdb) b
    Num Type         Disp Enb   Where
    1   breakpoint   keep yes   at /Users/ksnowlv/Documents/lvwei projects/python/thread_queue.py:27
    2   breakpoint   keep yes   at /Users/ksnowlv/Documents/lvwei projects/python/thread_queue.py:45
    (Pdb) b 33
    Breakpoint 4 at /Users/ksnowlv/Documents/lvwei projects/python/thread_queue.py:33
    (Pdb) c
    > /Users/ksnowlv/Documents/lvwei projects/python/thread_queue.py(45)<module>()
    -> threadID = 1
    (Pdb) p threadList
    ['ksnow', 'kair', 'baby']
    (Pdb) pp nameList
    ['One', 'Two', 'Three', 'Four', 'Five']
    (Pdb) n
    > /Users/ksnowlv/Documents/lvwei projects/python/thread_queue.py(48)<module>()
    -> for tName in threadList:
    (Pdb) n
    > /Users/ksnowlv/Documents/lvwei projects/python/thread_queue.py(49)<module>()
    -> thread = QThread(threadID, tName, workQueue)
    (Pdb) s
    --Call--
    > /Users/ksnowlv/Documents/lvwei projects/python/thread_queue.py(14)__init__()
    -> def __init__(self, threadID, name, queue):
    (Pdb) s
    > /Users/ksnowlv/Documents/lvwei projects/python/thread_queue.py(15)__init__()
    -> threading.Thread.__init__(self)
    (Pdb) s
    --Call--
    > /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py(654)__init__()
    -> def __init__(self, group=None, target=None, name=None,
    (Pdb) c
    Starting ksnow
    Starting kair
    Starting baby
    ksnow processing One
    baby processing Two
     kair processing Three
    ksnow processing Four
    kair processing Five
    Exiting baby
    Exiting ksnow
    Exiting kair
    Exiting Main Thread
    Exception AttributeError: "'NoneType' object has no attribute 'path'" in <function _remove at 0x10fb59b18> ignored
    ksnowlv@ksnowlvdeMacBook-Pro~/Documents/lvwei projects/python$