sys.__breakpointhook__ should be available when __builtin__.breakpoint is set. Fixes #766 (#767)

* sys.__breakpointhook__ should be available when __builtin__.breakpoint is set. Fixes #766

* On Python 3.7, sys.__breakpointhook__ should not be tested as it'll call the original pdb version.
This commit is contained in:
Fabio Zadrozny 2018-08-27 17:21:32 -03:00 committed by Karthik Nadig
parent ea24922b71
commit 425291ed88
6 changed files with 37 additions and 6 deletions

View file

@ -60,7 +60,12 @@ def install_breakpointhook():
def custom_sitecustomize_breakpointhook(*args, **kwargs):
import os
hookname = os.getenv('PYTHONBREAKPOINT')
if hookname is not None and len(hookname) > 0 and hasattr(sys, '__breakpointhook__'):
if (
hookname is not None
and len(hookname) > 0
and hasattr(sys, '__breakpointhook__')
and sys.__breakpointhook__ != custom_sitecustomize_breakpointhook
):
sys.__breakpointhook__(*args, **kwargs)
else:
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
@ -87,6 +92,7 @@ def install_breakpointhook():
# In older versions, breakpoint() isn't really available, so, install the hook directly
# in the builtins.
__builtin__.breakpoint = custom_sitecustomize_breakpointhook
sys.__breakpointhook__ = custom_sitecustomize_breakpointhook
# Install the breakpoint hook at import time.
install_breakpointhook()

View file

@ -59,7 +59,12 @@ def install_breakpointhook(pydevd_breakpointhook=None):
if pydevd_breakpointhook is None:
def pydevd_breakpointhook(*args, **kwargs):
hookname = os.getenv('PYTHONBREAKPOINT')
if hookname is not None and len(hookname) > 0 and hasattr(sys, '__breakpointhook__'):
if (
hookname is not None
and len(hookname) > 0
and hasattr(sys, '__breakpointhook__')
and sys.__breakpointhook__ != pydevd_breakpointhook
):
sys.__breakpointhook__(*args, **kwargs)
else:
settrace(*args, **kwargs)
@ -83,6 +88,7 @@ def install_breakpointhook(pydevd_breakpointhook=None):
# In older versions, breakpoint() isn't really available, so, install the hook directly
# in the builtins.
__builtin__.breakpoint = pydevd_breakpointhook
sys.__breakpointhook__ = pydevd_breakpointhook
# Install the breakpoint hook at import time.
install_breakpointhook()

View file

@ -1,3 +1,4 @@
def break_in_method():
breakpoint() # Builtin on Py3, but we provide a backport on Py2.

View file

@ -0,0 +1,7 @@
import sys
def break_in_method():
sys.__breakpointhook__() # Builtin on Py3, but we provide a backport on Py2.
break_in_method()
print('TEST SUCEEDED')

View file

@ -1769,12 +1769,21 @@ def test_stop_on_start_regular(case_setup):
writer.finished_ok = True
def test_py_37_breakpoint(case_setup):
with case_setup.test_file('_debugger_case_breakpoint.py') as writer:
def _get_breakpoint_cases():
if sys.version_info >= (3, 7):
# Just check breakpoint()
return ('_debugger_case_breakpoint.py',)
else:
# Check breakpoint() and sys.__breakpointhook__ replacement.
return ('_debugger_case_breakpoint.py', '_debugger_case_breakpoint2.py')
@pytest.mark.parametrize("filename", _get_breakpoint_cases())
def test_py_37_breakpoint(case_setup, filename):
with case_setup.test_file(filename) as writer:
writer.write_make_initial_run()
hit = writer.wait_for_breakpoint_hit(
REASON_THREAD_SUSPEND, file='_debugger_case_breakpoint.py', line=2)
REASON_THREAD_SUSPEND, file=filename, line=3)
writer.write_run_thread(hit.thread_id)

View file

@ -13,6 +13,8 @@ IS_PY36 = sys.version_info[0] == 3 and sys.version_info[1] == 6
TEST_CYTHON = os.getenv('PYDEVD_USE_CYTHON', None) == 'YES'
IS_APPVEYOR = os.environ.get('APPVEYOR', '') in ('True', 'true', '1')
SKIP_FRAME_EVAL_TESTS = False
class WriterThreadStepAndResume(debugger_unittest.AbstractWriterThread):
@ -197,7 +199,7 @@ class WriterThreadAddTerminationExceptionBreak(debugger_unittest.AbstractWriterT
@pytest.mark.skipif(
True,
SKIP_FRAME_EVAL_TESTS,
reason='Frame eval is not currently meant to be used in the debugger and tests are flaky.\n'
'Feature must be reviewed to be included again.\n'
)