2012-10-10 4 views
7

Betrachten Sie dieses multi-threaded Programm:pdb kann nicht in einen anderen Thread einbrechen?

import threading 

class SomeThread(threading.Thread): 
    def run(self): 
    a = 1 
    print a 

def main(): 
    print 'hola' 
    someThread = SomeThread() 
    someThread.start() 

if __name__ == '__main__': 
    main() 

Wenn ich debuggen dieses Programm mit pdb, an der Eingabeaufforderung ich an jedem ersten der beiden print-Anweisungen einen Haltepunkt gesetzt. Dann fahre ich fort. pdb bricht um print 'hola'. Ich fahre fort und sehe den Effekt des Drucks in dem anderen Thread, aber pdb bricht nicht.

Die Hilfebefehle listen nichts auf, um Threadkontexte wie gdb zu wechseln ... also ... ist es in einem Threadkontext einfach nicht möglich, einen Haltepunkt zu setzen, der in einem anderen Kontext ausgelöst wird?

Antwort

5

Dies funktioniert für mich:

import threading 
import pdb 

class SomeThread(threading.Thread): 
    def run(self): 
    a = 1 
    print a 
    pdb.set_trace() 

def main(): 
    print 'hola' 
    pdb.set_trace() 
    someThread = SomeThread() 
    someThread.start() 

if __name__ == '__main__': 
    main() 

Was gibt mir:

C:\Code>python b.py 
hola 
> c:\code\b.py(13)main() 
-> someThread = SomeThread() 
(Pdb) l 
    8   pdb.set_trace() 
    9 
10  def main(): 
11  print 'hola' 
12  pdb.set_trace() 
13 -> someThread = SomeThread() 
14  someThread.start() 
15 
16  if __name__ == '__main__': 
17  main() 
[EOF] 
(Pdb) c 
1 
--Return-- 
> c:\code\b.py(8)run()->None 
-> pdb.set_trace() 
(Pdb) l 
    3 
    4  class SomeThread(threading.Thread): 
    5  def run(self): 
    6   a = 1 
    7   print a 
    8 ->  pdb.set_trace() 
    9 
10  def main(): 
11  print 'hola' 
12  pdb.set_trace() 
13  someThread = SomeThread() 
(Pdb) 

Dies ist unter Windows 7 und mit Python 2.7.2. Was OS & Python-Version verwenden Sie?

0

, nachdem Sie Ihren ersten Haltepunkt erreicht, gehe ich davon aus, mit dem Sie treten (n) nächste Zeile , wenn Sie auf diese Linie erhalten

someThread.start() 

stellen Sie sicher, Sie verwenden (s) Schritt-in und nicht (n) als nächstes. pdb commands