diff --git a/ptvsd/_vendored/pydevd/_pydevd_bundle/pydevd_frame.py b/ptvsd/_vendored/pydevd/_pydevd_bundle/pydevd_frame.py index 284ee661..25c3233c 100644 --- a/ptvsd/_vendored/pydevd/_pydevd_bundle/pydevd_frame.py +++ b/ptvsd/_vendored/pydevd/_pydevd_bundle/pydevd_frame.py @@ -621,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 not breakpoint and is_line: # No stop from anyone and no breakpoint found in line (cache that). frame_skips_cache[line_cache_key] = 0 diff --git a/ptvsd/_vendored/pydevd/tests_python/_debugger_case_skip_breakpoint_in_exceptions.py b/ptvsd/_vendored/pydevd/tests_python/_debugger_case_skip_breakpoint_in_exceptions.py new file mode 100644 index 00000000..fca9a9e2 --- /dev/null +++ b/ptvsd/_vendored/pydevd/tests_python/_debugger_case_skip_breakpoint_in_exceptions.py @@ -0,0 +1,8 @@ +if __name__ == '__main__': + for i in range(2): + print("one") + try: + raise AttributeError() # Breakpoint here + except: + pass + print('TEST SUCEEDED!') \ No newline at end of file diff --git a/ptvsd/_vendored/pydevd/tests_python/test_debugger.py b/ptvsd/_vendored/pydevd/tests_python/test_debugger.py index 2875fbd4..49a7a0c7 100644 --- a/ptvsd/_vendored/pydevd/tests_python/test_debugger.py +++ b/ptvsd/_vendored/pydevd/tests_python/test_debugger.py @@ -1285,6 +1285,29 @@ class WriterThreadCaseEventExt(debugger_unittest.AbstractWriterThread): env["VERIFY_EVENT_TEST"] = "1" return env +#======================================================================================================================= +# WriterThreadCaseSkipBreakpointInExceptions - fix case where breakpoint is skipped after an exception is raised over it +#====================================================================================================================== +class WriterThreadCaseSkipBreakpointInExceptions(debugger_unittest.AbstractWriterThread): + + TEST_FILE = debugger_unittest._get_debugger_test_file('_debugger_case_skip_breakpoint_in_exceptions.py') + + def run(self): + self.start_socket() + self.write_add_breakpoint(5, None) + self.write_make_initial_run() + + thread_id, frame_id, line = self.wait_for_breakpoint_hit('111', True) + assert line == 5, 'Expected return to be in line 5, was: %s' % line + self.write_run_thread(thread_id) + + thread_id, frame_id, line = self.wait_for_breakpoint_hit('111', True) + assert line == 5, 'Expected return to be in line 5, was: %s' % line + self.write_run_thread(thread_id) + + + self.finished_ok = True + #======================================================================================================================= # Test #======================================================================================================================= @@ -1463,6 +1486,9 @@ class Test(unittest.TestCase, debugger_unittest.DebuggerRunner): def test_case_event_ext(self): self.check_case(WriterThreadCaseEventExt) + def test_case_skip_breakpoints_in_exceptions(self): + self.check_case(WriterThreadCaseSkipBreakpointInExceptions) + @pytest.mark.skipif(not IS_CPYTHON, reason='CPython only test.') class TestPythonRemoteDebugger(unittest.TestCase, debugger_unittest.DebuggerRunner):