From a7282e9232e60d51807907e04ed3f0a2c9b27a7f Mon Sep 17 00:00:00 2001 From: Fabio Zadrozny Date: Thu, 10 Dec 2020 09:27:54 -0300 Subject: [PATCH] Properly handle sys.exit() as sys.exit(0). Fixes #489 --- .../pydevd_process_net_command_json.py | 2 +- .../resources/_debugger_case_sysexit_none.py | 9 +++++++++ .../pydevd/tests_python/test_debugger_json.py | 14 ++++++++------ 3 files changed, 18 insertions(+), 7 deletions(-) create mode 100644 src/debugpy/_vendored/pydevd/tests_python/resources/_debugger_case_sysexit_none.py diff --git a/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_process_net_command_json.py b/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_process_net_command_json.py index d1827d5cd..451dc6720 100644 --- a/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_process_net_command_json.py +++ b/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_process_net_command_json.py @@ -390,7 +390,7 @@ def get_variable_presentation(setting, default): self.api.set_show_return_values(py_db, self._options.show_return_value) if not self._options.break_system_exit_zero: - ignore_system_exit_codes = [0] + ignore_system_exit_codes = [0, None] if self._options.django_debug: ignore_system_exit_codes += [3] diff --git a/src/debugpy/_vendored/pydevd/tests_python/resources/_debugger_case_sysexit_none.py b/src/debugpy/_vendored/pydevd/tests_python/resources/_debugger_case_sysexit_none.py new file mode 100644 index 000000000..1d0d524c9 --- /dev/null +++ b/src/debugpy/_vendored/pydevd/tests_python/resources/_debugger_case_sysexit_none.py @@ -0,0 +1,9 @@ +import sys + + +def main(): + print('TEST SUCEEDED!') + sys.exit() + + +main() # call_main_line diff --git a/src/debugpy/_vendored/pydevd/tests_python/test_debugger_json.py b/src/debugpy/_vendored/pydevd/tests_python/test_debugger_json.py index 4d9b24e1c..3b112f51b 100644 --- a/src/debugpy/_vendored/pydevd/tests_python/test_debugger_json.py +++ b/src/debugpy/_vendored/pydevd/tests_python/test_debugger_json.py @@ -1011,17 +1011,19 @@ def test_case_sys_exit_unhandled_exception(case_setup): @pytest.mark.parametrize('break_on_system_exit_zero', [True, False]) -def test_case_sys_exit_0_unhandled_exception(case_setup, break_on_system_exit_zero): +@pytest.mark.parametrize('target', ['_debugger_case_sysexit_0.py', '_debugger_case_sysexit_none.py']) +def test_case_sys_exit_0_unhandled_exception(case_setup, break_on_system_exit_zero, target): - with case_setup.test_file('_debugger_case_sysexit_0.py', EXPECTED_RETURNCODE=0) as writer: + with case_setup.test_file(target, EXPECTED_RETURNCODE=0) as writer: json_facade = JsonFacade(writer) - json_facade.write_launch( - debugOptions=['BreakOnSystemExitZero'] if break_on_system_exit_zero else [], - ) + kwargs = {} + if break_on_system_exit_zero: + kwargs = {'breakOnSystemExitZero': True} + json_facade.write_launch(**kwargs) json_facade.write_set_exception_breakpoints(['uncaught']) json_facade.write_make_initial_run() - break_line = writer.get_line_index_with_content('sys.exit(0)') + break_line = writer.get_line_index_with_content('sys.exit(') if break_on_system_exit_zero: json_facade.wait_for_thread_stopped( reason='exception', line=break_line)