From 79a6ca9ad36fe079dc5aaa08c57f264e5bae4496 Mon Sep 17 00:00:00 2001 From: fitermay Date: Wed, 21 Mar 2018 21:30:28 -0400 Subject: [PATCH] PY-29051: Fix breakpoints on lines that throw exceptions Those lines were hit the first time. The subsequent times incorrect caching prevented the breakpoints from activating Also minor: provide cython type for 'stop' local --- .../pydev/_pydevd_bundle/pydevd_frame.py | 3 ++- .../tests_pydevd_python/_debugger_case20.py | 15 +++++++++++++ .../tests_pydevd_python/test_debugger.py | 21 +++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 python/helpers/pydev/tests_pydevd_python/_debugger_case20.py diff --git a/python/helpers/pydev/_pydevd_bundle/pydevd_frame.py b/python/helpers/pydev/_pydevd_bundle/pydevd_frame.py index 5df7448637d6..5afef45a65f6 100644 --- a/python/helpers/pydev/_pydevd_bundle/pydevd_frame.py +++ b/python/helpers/pydev/_pydevd_bundle/pydevd_frame.py @@ -396,6 +396,7 @@ class PyDBFrame: # cdef bint is_return; # cdef str curr_func_name; # cdef bint exist_result; + # cdef bint stop; # cdef dict frame_skips_cache; # cdef tuple frame_cache_key; # cdef tuple line_cache_key; @@ -620,7 +621,7 @@ class PyDBFrame: self.do_wait_suspend(thread, frame, event, arg) return self.trace_dispatch else: - if not breakpoint and not is_return: + if breakpoint is None and not (is_return or is_exception_event): # No stop from anyone and no breakpoint found in line (cache that). frame_skips_cache[line_cache_key] = 0 diff --git a/python/helpers/pydev/tests_pydevd_python/_debugger_case20.py b/python/helpers/pydev/tests_pydevd_python/_debugger_case20.py new file mode 100644 index 000000000000..5d555162324f --- /dev/null +++ b/python/helpers/pydev/tests_pydevd_python/_debugger_case20.py @@ -0,0 +1,15 @@ +def fn_with_except(): + try: + raise Exception() + except: + pass + + +def test_except(): + fn_with_except() + fn_with_except() + + +if __name__ == '__main__': + test_except() + print('TEST SUCEEDED') diff --git a/python/helpers/pydev/tests_pydevd_python/test_debugger.py b/python/helpers/pydev/tests_pydevd_python/test_debugger.py index d1f13415b1b5..fe5497eede78 100644 --- a/python/helpers/pydev/tests_pydevd_python/test_debugger.py +++ b/python/helpers/pydev/tests_pydevd_python/test_debugger.py @@ -226,6 +226,23 @@ class WriterThreadCase19(debugger_unittest.AbstractWriterThread): self.finished_ok = True +#======================================================================================================================= +# WriterThreadCase20 - [Test Case]: Breakpoint on line with exception +#====================================================================================================================== +class WriterThreadCase20(debugger_unittest.AbstractWriterThread): + + TEST_FILE = debugger_unittest._get_debugger_test_file('_debugger_case20.py') + + def run(self): + self.start_socket() + self.write_add_breakpoint(3, 'fn_with_except') + self.write_make_initial_run() + for i in range(2): + thread_id, frame_id, line = self.wait_for_breakpoint_hit('111', True) + assert line == 3, 'Expected return to be in line 3, was: %s' % line + self.write_run_thread(thread_id) + + self.finished_ok = True #======================================================================================================================= # WriterThreadCase18 - [Test Case]: change local variable @@ -1347,6 +1364,10 @@ class Test(unittest.TestCase, debugger_unittest.DebuggerRunner): def test_case_19(self): self.check_case(WriterThreadCase19) + # PY-29051 + def test_case_20(self): + self.check_case(WriterThreadCase20) + if TEST_DJANGO: def test_case_django(self): self.check_case(WriterThreadCaseDjango)