2016-03-28 1 views
3

Suite à un tutorial on Python's debugger, j'ai utilisé pdb.set_trace() pour interrompre l'exemple de code. Cela a fonctionné, mais que faire si vous êtes à l'invite interactive et que vous voulez un autre point d'arrêt imbriqué?Les points d'arrêt imbriqués sont-ils possibles dans pdb - sinon, qu'est-ce qui les empêche?

(Pdb) def test(): pdb.set_trace(); print "don't print this yet" 
(Pdb) test() 
don't print this yet 

Il n'a pas arrêté. Le débogueur est-il fondamentalement "un profond"? par exemple. est-ce une limitation des hooks de Python, ou juste quelque chose que pdb ne choisit pas de faire?

Répondre

0

est-ce une limitation des crochets de Python, ou juste quelque chose que pdb ne choisit pas de faire?

Il semble s'agir d'une limitation des crochets.

J'ai fait un test pour voir ce qui a été appelé et ce qui n'a pas été (mettre des déclarations d'impression à /usr/lib/python2.7/bdb.py)

inspection rapide trouve set_trace dans pdb.py:

def set_trace(): 
    Pdb().set_trace(sys._getframe().f_back) 

qui appelle set_trace dans bdb.py

def set_trace(self, frame=None): 
    """Start debugging from `frame`. 
    If frame is not specified, debugging starts from caller's frame. 
    """ 
    if frame is None: 
     frame = sys._getframe().f_back 
    self.reset() 
    while frame: 
     frame.f_trace = self.trace_dispatch 
     self.botframe = frame 
     frame = frame.f_back 
    self.set_step() 
    sys.settrace(self.trace_dispatch) 

Cela configure un rappel à trace_dispatch, also in bdb.py. Le code sys.settrace lui-même est peut-être threading.py:

def settrace(func): 
    global _trace_hook 
    _trace_hook = func 

recherche GitHub ne trouve pas plus de références pour _trace_hook, on peut donc supposer que est ramassé par magie dans le code C quelque part.

Lorsque test() est appelé, il s'avère que l'appel de sys.settrace() est effectué ... mais l'appel à trace_dispatch() ne se produit pas.