2016-03-28 5 views
3

Следуя tutorial on Python's debugger, я использовал pdb.set_trace() для прерывания кода примера. Это сработало, но что, если вы находитесь в интерактивном приглашении и хотите еще одну вложенную точку останова?Возможны вложенные точки останова в pdb - если нет, что их предотвращает?

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

Это не остановилось. Является ли отладчик фундаментально «одним глубоким»? например это ограничение на крючки Python или просто что-то, что pdb не хочет делать?

ответ

0

Это ограничение на крючки Python или просто что-то, что pdb не хочет делать?

Похоже, что это ограничение крючков.

Я сделал тест, чтобы увидеть, что называют и то, что не было (сдачи заявления печати в /usr/lib/python2.7/bdb.py)

Быстрый осмотр находит set_trace в pdb.py:

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

Это вызывает set_trace в 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) 

Это устанавливает обратный вызов trace_dispatch, also in bdb.py. Сам код sys.settrace, возможно, в threading.py:

def settrace(func): 
    global _trace_hook 
    _trace_hook = func 

поиск GitHub не находит больше ссылок на _trace_hook, поэтому, вероятно, что это взял волшебно в коде C где-нибудь.

Когда вызов test() вызывается, вызов sys.settrace() выполняется ... но тогда вызова trace_dispatch() не происходит.