New submission from Xavier de Gaye: The following debugging session, run with python on the default branch, shows that pdb does not stop in __del__ when it is invoked.
The reason is: - The destructor is not called when processing the 'c = 1' statement because foo frame.f_locals owns a reference to the C instance. - When the interpreter is about to invoke the trace function with the ensuing debug event, the call to PyFrame_LocalsToFast in call_trampoline causes the destructor to be invoked (as shown by gdb), and the destructor is not traced because at that time tstate->use_tracing is false. This is confirmed by the fact that when 'c = 1' is replaced with 'c = 1; locals()' (on one single line so as not to trigger the trace function before the call to locals()), then pdb stops in __del__. === foo.py ================ class C: def __del__(self): print("Calling C destructor.") def foo(): c = C() import pdb; pdb.set_trace() c = 1 foo() =============================== $ ./python /tmp/foo.py > /tmp/foo.py(8)foo() -> c = 1 (Pdb) step Calling C destructor. --Return-- > /tmp/foo.py(8)foo()->None -> c = 1 (Pdb) =============================== ---------- components: Interpreter Core messages: 177240 nosy: xdegaye priority: normal severity: normal status: open title: reference kept in f_locals prevents the tracing/profiling of a destructor type: behavior versions: Python 3.4 _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue16653> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com