debugpy 1.8.5__zip → 1.8.6__zip
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {debugpy-1.8.5/src/debugpy.egg-info → debugpy-1.8.6}/PKG-INFO +1 -1
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_calltip_util.py +19 -21
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_completer.py +30 -30
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_execfile.py +3 -1
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_filesystem_encoding.py +43 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_getopt.py +35 -32
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_imports_tipper.py +83 -84
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_jy_imports_tipper.py +92 -99
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_log.py +2 -3
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_saved_modules.py +51 -27
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_sys_patch.py +11 -7
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_tipper_common.py +6 -5
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/fsnotify/__init__.py +34 -38
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/pydev_console_utils.py +71 -69
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/pydev_import_hook.py +1 -3
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/pydev_imports.py +0 -1
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/pydev_ipython_console.py +14 -16
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/pydev_ipython_console_011.py +81 -93
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/pydev_is_thread_alive.py +3 -3
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/pydev_localhost.py +9 -8
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/pydev_log.py +33 -25
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/pydev_monkey.py +183 -170
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/pydev_monkey_qt.py +33 -29
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/pydev_override.py +6 -4
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/pydev_umd.py +19 -18
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/pydev_versioncheck.py +3 -3
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles.py +165 -138
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_coverage.py +77 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_nose.py +35 -36
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_parallel.py +22 -23
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_parallel_client.py +37 -57
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_pytest2.py +54 -52
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_unittest.py +28 -37
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_xml_rpc.py +56 -53
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__main__pydevd_gen_debug_adapter_protocol.py +604 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/debugProtocol.json +551 -445
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/pydevd_base_schema.py +25 -29
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/pydevd_schema.py +17458 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/pydevd_schema_log.py +11 -12
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevconsole_code.py +18 -19
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_additional_thread_info.py +41 -0
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_additional_thread_info_regular.py +327 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_api.py +263 -214
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_breakpoints.py +7 -10
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_bytecode_utils.py +187 -92
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_bytecode_utils_py311.py +105 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_code_to_source.py +46 -51
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_collect_bytecode_info.py +239 -176
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_comm.py +370 -297
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_comm_constants.py +78 -86
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_command_line_handling.py +55 -59
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/pydevd_concurrency_logger.py +194 -58
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/pydevd_thread_wrappers.py +2 -3
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_console.py +18 -23
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_constants.py +157 -127
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_custom_frames.py +10 -12
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.c +35217 -23106
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pxd +15 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.pyx +802 -511
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython_wrapper.py +18 -7
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_daemon_thread.py +32 -24
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_defaults.py +11 -13
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_dont_trace.py +16 -16
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_dont_trace_files.py +27 -2
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_exec2.py +1 -1
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_extension_api.py +4 -5
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_extension_utils.py +8 -10
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_filtering.py +50 -45
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_frame.py +462 -407
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_frame_utils.py +63 -61
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_gevent_integration.py +14 -16
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_import_class.py +27 -25
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_io.py +40 -42
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_json_debug_options.py +200 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_net_command.py +20 -19
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_net_command_factory_json.py +199 -108
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_net_command_factory_xml.py +121 -73
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_plugin_utils.py +208 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_process_net_command.py +206 -159
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_process_net_command_json.py +346 -334
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_referrers.py +75 -80
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_reload.py +35 -35
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_resolver.py +116 -124
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_runpy.py +44 -58
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_safe_repr.py +51 -55
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_save_locals.py +4 -2
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_signature.py +24 -24
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_source_mapping.py +19 -20
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_stackless.py +45 -49
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_suspended_frames.py +61 -58
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_thread_lifecycle.py +23 -13
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_timeout.py +29 -31
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_trace_dispatch.py +41 -11
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_trace_dispatch_regular.py +117 -55
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_traceproperty.py +11 -14
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_utils.py +90 -89
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_vars.py +106 -97
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_vm_type.py +40 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_xml.py +56 -46
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_eval_cython_wrapper.py +5 -5
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_eval_main.py +71 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.c +11165 -5326
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_tracing.py +5 -6
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_modify_bytecode.py +53 -56
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/__init__.py +1 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/bytecode.py +4 -6
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/cfg.py +6 -26
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/concrete.py +7 -21
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/flags.py +5 -24
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/instr.py +10 -34
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/peephole_opt.py +1 -4
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/__init__.py +2 -6
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_bytecode.py +3 -5
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_cfg.py +11 -31
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_code.py +2 -2
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_concrete.py +14 -41
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_flags.py +2 -4
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_instr.py +7 -18
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_misc.py +6 -18
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/test_peephole_opt.py +7 -18
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests/util_annotation.py +1 -3
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/pydevd_fix_code.py +14 -19
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/_pydevd_sys_monitoring/_pydevd_sys_monitoring.py +1927 -0
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/_pydevd_sys_monitoring/_pydevd_sys_monitoring_cython.c +43058 -0
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/_pydevd_sys_monitoring/_pydevd_sys_monitoring_cython.pxd +46 -0
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/_pydevd_sys_monitoring/_pydevd_sys_monitoring_cython.pyx +1934 -0
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/_pydevd_sys_monitoring/pydevd_sys_monitoring.py +16 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydev_app_engine_debug_startup.py +12 -11
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydev_coverage.py +30 -32
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydev_ipython/inputhook.py +58 -54
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydev_ipython/inputhookglut.py +20 -24
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydev_ipython/inputhookgtk.py +8 -7
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydev_ipython/inputhookgtk3.py +8 -6
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydev_ipython/inputhookpyglet.py +11 -8
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydev_ipython/inputhookqt4.py +21 -18
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydev_ipython/inputhookqt5.py +17 -15
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydev_ipython/inputhookqt6.py +17 -15
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydev_ipython/inputhooktk.py +6 -4
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydev_ipython/inputhookwx.py +14 -10
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydev_ipython/matplotlibtools.py +30 -26
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/pydev_ipython/qt.py +24 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydev_ipython/qt_for_kernel.py +37 -34
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydev_ipython/qt_loaders.py +86 -73
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydev_ipython/version.py +7 -7
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/pydev_pysrc.py +1 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydev_run_in_console.py +23 -24
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/pydev_sitecustomize/sitecustomize.py +267 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevconsole.py +55 -47
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd.py +732 -508
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/_always_live_program.py +40 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/_check.py +1 -0
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/_test_attach_to_process.py +11 -0
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/_test_attach_to_process_linux.py +75 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/add_code_to_python_process.py +130 -125
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/attach_amd64.dll +0 -0
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/attach_amd64.pdb +0 -0
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/attach_pydevd.py +89 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/attach_script.py +41 -32
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/attach_x86.dll +0 -0
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/attach_x86.pdb +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_utils.hpp +1 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_version.hpp +9 -1
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/inject_dll_amd64.exe +0 -0
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/inject_dll_amd64.pdb +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/inject_dll_x86.exe +0 -0
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/inject_dll_x86.pdb +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/lldb_prepare.py +10 -9
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/run_code_on_dllmain_amd64.dll +0 -0
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/run_code_on_dllmain_amd64.pdb +0 -0
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/run_code_on_dllmain_x86.dll +0 -0
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/run_code_on_dllmain_x86.pdb +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/__init__.py +103 -119
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/breakpoint.py +457 -516
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/compat.py +33 -15
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/crash.py +336 -281
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/debug.py +101 -131
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/disasm.py +148 -153
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/event.py +310 -302
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/interactive.py +235 -208
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/module.py +185 -218
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/process.py +428 -564
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/registry.py +54 -53
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/search.py +69 -73
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/sql.py +158 -170
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/system.py +143 -213
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/textio.py +302 -333
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/thread.py +220 -239
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/util.py +198 -177
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/__init__.py +11 -11
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/advapi32.py +1191 -713
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/context_amd64.py +248 -194
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/context_i386.py +132 -120
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/dbghelp.py +450 -346
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/defines.py +305 -286
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/gdi32.py +526 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/kernel32.py +1479 -1097
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/ntdll.py +579 -0
- debugpy-1.8.6/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/peb_teb.py +3517 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/psapi.py +54 -31
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/shell32.py +170 -149
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/shlwapi.py +190 -108
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/user32.py +542 -437
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/version.py +489 -442
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/wtsapi32.py +83 -65
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/window.py +70 -76
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/attach.cpp +17 -9
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/compile_windows.bat +1 -1
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_file_utils.py +141 -120
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_plugins/__init__.py +1 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_plugins/django_debug.py +175 -149
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_plugins/extensions/__init__.py +1 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/__init__.py +1 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/pydevd_helpers.py +5 -5
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/pydevd_plugin_numpy_types.py +28 -28
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/pydevd_plugin_pandas_types.py +22 -30
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_plugins/extensions/types/pydevd_plugins_django_form_str.py +3 -2
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_plugins/jinja2_debug.py +130 -108
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_plugins/pydevd_line_validation.py +27 -14
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_tracing.py +85 -66
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/setup_pydevd_cython.py +96 -59
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_version.py +3 -3
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/common/messaging.py +2 -1
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/server/cli.py +32 -17
- {debugpy-1.8.5 → debugpy-1.8.6/src/debugpy.egg-info}/PKG-INFO +1 -1
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy.egg-info/SOURCES.txt +6 -1
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/_pydev_bundle/_pydev_filesystem_encoding.py +0 -41
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/_pydev_runfiles/pydev_runfiles_coverage.py +0 -76
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__main__pydevd_gen_debug_adapter_protocol.py +0 -592
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/pydevd_schema.py +0 -19514
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_additional_thread_info.py +0 -19
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_additional_thread_info_regular.py +0 -153
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_json_debug_options.py +0 -204
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_plugin_utils.py +0 -91
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_trace_api.py +0 -62
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_vm_type.py +0 -41
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_eval_main.py +0 -48
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/pydev_ipython/qt.py +0 -23
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/pydev_pysrc.py +0 -1
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/pydev_sitecustomize/sitecustomize.py +0 -237
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/_always_live_program.py +0 -32
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/_test_attach_to_process.py +0 -9
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/_test_attach_to_process_linux.py +0 -74
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/attach_amd64.dll +0 -0
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/attach_amd64.pdb +0 -0
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/attach_pydevd.py +0 -79
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/attach_x86.dll +0 -0
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/attach_x86.pdb +0 -0
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/inject_dll_amd64.exe +0 -0
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/inject_dll_amd64.pdb +0 -0
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/inject_dll_x86.pdb +0 -0
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/run_code_on_dllmain_amd64.dll +0 -0
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/run_code_on_dllmain_amd64.pdb +0 -0
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/run_code_on_dllmain_x86.dll +0 -0
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/run_code_on_dllmain_x86.pdb +0 -0
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/gdi32.py +0 -507
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/ntdll.py +0 -539
- debugpy-1.8.5/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/winappdbg/win32/peb_teb.py +0 -3435
- {debugpy-1.8.5 → debugpy-1.8.6}/DESCRIPTION.md +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/LICENSE +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/MANIFEST.in +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/README.md +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/pyproject.toml +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/setup.cfg +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/setup.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/ThirdPartyNotices.txt +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/__init__.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/__main__.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/__init__.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/_pydevd_packaging.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/_util.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/force_pydevd.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_bundle/__init__.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydev_runfiles/__init__.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/__init__.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/__init__.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/_debug_adapter/debugProtocolCustom.json +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_concurrency_analyser/__init__.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/.gitignore +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/__init__.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pxd +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.pyx +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.template.pyx +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/release_mem.h +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/README.txt +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/__init__.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydev_ipython/README +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydev_ipython/__init__.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydev_sitecustomize/__not_in_default_pythonpath.txt +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/README.txt +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_custom_pyeval_settrace.hpp +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_custom_pyeval_settrace_310.hpp +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_custom_pyeval_settrace_311.hpp +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_custom_pyeval_settrace_common.hpp +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_settrace.hpp +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/python.h +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/ref_utils.hpp +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/.gitignore +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/attach.cpp +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/compile_linux.sh +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/compile_mac.sh +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/compile_manylinux.cmd +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/attach.h +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/inject_dll.cpp +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/py_win_helpers.hpp +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/run_code_in_memory.hpp +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/run_code_on_dllmain.cpp +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/stdafx.cpp +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/stdafx.h +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/windows/targetver.h +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/_vendored/pydevd/pydevd_plugins/extensions/README.md +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/adapter/__init__.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/adapter/__main__.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/adapter/clients.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/adapter/components.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/adapter/launchers.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/adapter/servers.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/adapter/sessions.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/common/__init__.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/common/json.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/common/log.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/common/singleton.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/common/sockets.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/common/stacks.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/common/timestamp.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/common/util.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/launcher/__init__.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/launcher/__main__.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/launcher/debuggee.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/launcher/handlers.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/launcher/output.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/launcher/winapi.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/public_api.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/server/__init__.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/server/api.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy/server/attach_pid_injected.py +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy.egg-info/dependency_links.txt +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy.egg-info/entry_points.txt +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/src/debugpy.egg-info/top_level.txt +0 -0
- {debugpy-1.8.5 → debugpy-1.8.6}/versioneer.py +0 -0
|
@@ -45,22 +45,18 @@ Crash dump support.
|
|
|
45
45
|
__revision__ = "$Id$"
|
|
46
46
|
|
|
47
47
|
__all__ = [
|
|
48
|
-
|
|
49
48
|
# Object that represents a crash in the debugee.
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
"Crash",
|
|
52
50
|
# Crash storage.
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
"CrashDictionary",
|
|
55
52
|
# Warnings.
|
|
56
|
-
|
|
57
|
-
|
|
53
|
+
"CrashWarning",
|
|
58
54
|
# Backwards compatibility with WinAppDbg 1.4 and before.
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
55
|
+
"CrashContainer",
|
|
56
|
+
"CrashTable",
|
|
57
|
+
"CrashTableMSSQL",
|
|
58
|
+
"VolatileCrashContainer",
|
|
59
|
+
"DummyCrashContainer",
|
|
64
60
|
]
|
|
65
61
|
|
|
66
62
|
from winappdbg import win32
|
|
@@ -79,11 +75,12 @@ import warnings
|
|
|
79
75
|
sql = None
|
|
80
76
|
anydbm = None
|
|
81
77
|
|
|
82
|
-
|
|
78
|
+
# ==============================================================================
|
|
83
79
|
|
|
84
80
|
# Secure alternative to pickle, use it if present.
|
|
85
81
|
try:
|
|
86
82
|
import cerealizer
|
|
83
|
+
|
|
87
84
|
pickle = cerealizer
|
|
88
85
|
|
|
89
86
|
# There is no optimization function for cerealized objects.
|
|
@@ -102,7 +99,6 @@ try:
|
|
|
102
99
|
|
|
103
100
|
# If cerealizer is not present fallback to the insecure pickle module.
|
|
104
101
|
except ImportError:
|
|
105
|
-
|
|
106
102
|
# Faster implementation of the pickle module as a C extension.
|
|
107
103
|
try:
|
|
108
104
|
import cPickle as pickle
|
|
@@ -118,10 +114,12 @@ except ImportError:
|
|
|
118
114
|
try:
|
|
119
115
|
from pickletools import optimize
|
|
120
116
|
except ImportError:
|
|
117
|
+
|
|
121
118
|
def optimize(picklestring):
|
|
122
119
|
return picklestring
|
|
123
120
|
|
|
124
|
-
|
|
121
|
+
|
|
122
|
+
class Marshaller(StaticClass):
|
|
125
123
|
"""
|
|
126
124
|
Custom pickler for L{Crash} objects. Optimizes the pickled data when using
|
|
127
125
|
the standard C{pickle} (or C{cPickle}) module. The pickled data is then
|
|
@@ -136,18 +134,22 @@ class Marshaller (StaticClass):
|
|
|
136
134
|
def loads(data):
|
|
137
135
|
return pickle.loads(zlib.decompress(data))
|
|
138
136
|
|
|
139
|
-
#==============================================================================
|
|
140
137
|
|
|
141
|
-
|
|
138
|
+
# ==============================================================================
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
class CrashWarning(Warning):
|
|
142
142
|
"""
|
|
143
143
|
An error occurred while gathering crash data.
|
|
144
144
|
Some data may be incomplete or missing.
|
|
145
145
|
"""
|
|
146
146
|
|
|
147
|
-
|
|
147
|
+
|
|
148
|
+
# ==============================================================================
|
|
149
|
+
|
|
148
150
|
|
|
149
151
|
# Crash object. Must be serializable.
|
|
150
|
-
class Crash
|
|
152
|
+
class Crash(object):
|
|
151
153
|
"""
|
|
152
154
|
Represents a crash, bug, or another interesting event in the debugee.
|
|
153
155
|
|
|
@@ -427,59 +429,59 @@ class Crash (object):
|
|
|
427
429
|
"""
|
|
428
430
|
|
|
429
431
|
# First of all, take the timestamp.
|
|
430
|
-
self.timeStamp
|
|
432
|
+
self.timeStamp = time.time()
|
|
431
433
|
|
|
432
434
|
# Notes are initially empty.
|
|
433
|
-
self.notes
|
|
435
|
+
self.notes = list()
|
|
434
436
|
|
|
435
437
|
# Get the process and thread, but dont't store them in the DB.
|
|
436
438
|
process = event.get_process()
|
|
437
|
-
thread
|
|
439
|
+
thread = event.get_thread()
|
|
438
440
|
|
|
439
441
|
# Determine the architecture.
|
|
440
|
-
self.os
|
|
441
|
-
self.arch
|
|
442
|
-
self.bits
|
|
442
|
+
self.os = System.os
|
|
443
|
+
self.arch = process.get_arch()
|
|
444
|
+
self.bits = process.get_bits()
|
|
443
445
|
|
|
444
446
|
# The following properties are always retrieved for all events.
|
|
445
|
-
self.eventCode
|
|
446
|
-
self.eventName
|
|
447
|
-
self.pid
|
|
448
|
-
self.tid
|
|
449
|
-
self.registers
|
|
450
|
-
self.labelPC
|
|
447
|
+
self.eventCode = event.get_event_code()
|
|
448
|
+
self.eventName = event.get_event_name()
|
|
449
|
+
self.pid = event.get_pid()
|
|
450
|
+
self.tid = event.get_tid()
|
|
451
|
+
self.registers = dict(thread.get_context())
|
|
452
|
+
self.labelPC = process.get_label_at_address(self.pc)
|
|
451
453
|
|
|
452
454
|
# The following properties are only retrieved for some events.
|
|
453
|
-
self.commandLine
|
|
454
|
-
self.environment
|
|
455
|
-
self.environmentData
|
|
456
|
-
self.registersPeek
|
|
457
|
-
self.debugString
|
|
458
|
-
self.modFileName
|
|
459
|
-
self.lpBaseOfDll
|
|
460
|
-
self.exceptionCode
|
|
461
|
-
self.exceptionName
|
|
455
|
+
self.commandLine = None
|
|
456
|
+
self.environment = None
|
|
457
|
+
self.environmentData = None
|
|
458
|
+
self.registersPeek = None
|
|
459
|
+
self.debugString = None
|
|
460
|
+
self.modFileName = None
|
|
461
|
+
self.lpBaseOfDll = None
|
|
462
|
+
self.exceptionCode = None
|
|
463
|
+
self.exceptionName = None
|
|
462
464
|
self.exceptionDescription = None
|
|
463
|
-
self.exceptionAddress
|
|
464
|
-
self.exceptionLabel
|
|
465
|
-
self.firstChance
|
|
466
|
-
self.faultType
|
|
467
|
-
self.faultAddress
|
|
468
|
-
self.faultLabel
|
|
469
|
-
self.isOurBreakpoint
|
|
465
|
+
self.exceptionAddress = None
|
|
466
|
+
self.exceptionLabel = None
|
|
467
|
+
self.firstChance = None
|
|
468
|
+
self.faultType = None
|
|
469
|
+
self.faultAddress = None
|
|
470
|
+
self.faultLabel = None
|
|
471
|
+
self.isOurBreakpoint = None
|
|
470
472
|
self.isSystemBreakpoint = None
|
|
471
|
-
self.stackTrace
|
|
472
|
-
self.stackTracePC
|
|
473
|
-
self.stackTraceLabels
|
|
474
|
-
self.stackTracePretty
|
|
475
|
-
self.stackRange
|
|
476
|
-
self.stackFrame
|
|
477
|
-
self.stackPeek
|
|
478
|
-
self.faultCode
|
|
479
|
-
self.faultMem
|
|
480
|
-
self.faultPeek
|
|
481
|
-
self.faultDisasm
|
|
482
|
-
self.memoryMap
|
|
473
|
+
self.stackTrace = None
|
|
474
|
+
self.stackTracePC = None
|
|
475
|
+
self.stackTraceLabels = None
|
|
476
|
+
self.stackTracePretty = None
|
|
477
|
+
self.stackRange = None
|
|
478
|
+
self.stackFrame = None
|
|
479
|
+
self.stackPeek = None
|
|
480
|
+
self.faultCode = None
|
|
481
|
+
self.faultMem = None
|
|
482
|
+
self.faultPeek = None
|
|
483
|
+
self.faultDisasm = None
|
|
484
|
+
self.memoryMap = None
|
|
483
485
|
|
|
484
486
|
# Get information for debug string events.
|
|
485
487
|
if self.eventCode == win32.OUTPUT_DEBUG_STRING_EVENT:
|
|
@@ -488,10 +490,12 @@ class Crash (object):
|
|
|
488
490
|
# Get information for module load and unload events.
|
|
489
491
|
# For create and exit process events, get the information
|
|
490
492
|
# for the main module.
|
|
491
|
-
elif self.eventCode in (
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
493
|
+
elif self.eventCode in (
|
|
494
|
+
win32.CREATE_PROCESS_DEBUG_EVENT,
|
|
495
|
+
win32.EXIT_PROCESS_DEBUG_EVENT,
|
|
496
|
+
win32.LOAD_DLL_DEBUG_EVENT,
|
|
497
|
+
win32.UNLOAD_DLL_DEBUG_EVENT,
|
|
498
|
+
):
|
|
495
499
|
aModule = event.get_module()
|
|
496
500
|
self.modFileName = event.get_filename()
|
|
497
501
|
if not self.modFileName:
|
|
@@ -503,50 +507,38 @@ class Crash (object):
|
|
|
503
507
|
# Get some information for exception events.
|
|
504
508
|
# To get the remaining information call fetch_extra_data().
|
|
505
509
|
elif self.eventCode == win32.EXCEPTION_DEBUG_EVENT:
|
|
506
|
-
|
|
507
510
|
# Exception information.
|
|
508
|
-
self.exceptionCode
|
|
509
|
-
self.exceptionName
|
|
510
|
-
self.exceptionDescription
|
|
511
|
-
self.exceptionAddress
|
|
512
|
-
self.firstChance
|
|
513
|
-
self.exceptionLabel
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
win32.EXCEPTION_GUARD_PAGE,
|
|
517
|
-
win32.EXCEPTION_IN_PAGE_ERROR):
|
|
518
|
-
self.faultType = event.get_fault_type()
|
|
511
|
+
self.exceptionCode = event.get_exception_code()
|
|
512
|
+
self.exceptionName = event.get_exception_name()
|
|
513
|
+
self.exceptionDescription = event.get_exception_description()
|
|
514
|
+
self.exceptionAddress = event.get_exception_address()
|
|
515
|
+
self.firstChance = event.is_first_chance()
|
|
516
|
+
self.exceptionLabel = process.get_label_at_address(self.exceptionAddress)
|
|
517
|
+
if self.exceptionCode in (win32.EXCEPTION_ACCESS_VIOLATION, win32.EXCEPTION_GUARD_PAGE, win32.EXCEPTION_IN_PAGE_ERROR):
|
|
518
|
+
self.faultType = event.get_fault_type()
|
|
519
519
|
self.faultAddress = event.get_fault_address()
|
|
520
|
-
self.faultLabel
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
self.isOurBreakpoint = hasattr(event, 'breakpoint') \
|
|
525
|
-
and event.breakpoint
|
|
526
|
-
self.isSystemBreakpoint = \
|
|
527
|
-
process.is_system_defined_breakpoint(self.exceptionAddress)
|
|
520
|
+
self.faultLabel = process.get_label_at_address(self.faultAddress)
|
|
521
|
+
elif self.exceptionCode in (win32.EXCEPTION_BREAKPOINT, win32.EXCEPTION_SINGLE_STEP):
|
|
522
|
+
self.isOurBreakpoint = hasattr(event, "breakpoint") and event.breakpoint
|
|
523
|
+
self.isSystemBreakpoint = process.is_system_defined_breakpoint(self.exceptionAddress)
|
|
528
524
|
|
|
529
525
|
# Stack trace.
|
|
530
526
|
try:
|
|
531
527
|
self.stackTracePretty = thread.get_stack_trace_with_labels()
|
|
532
528
|
except Exception:
|
|
533
529
|
e = sys.exc_info()[1]
|
|
534
|
-
warnings.warn(
|
|
535
|
-
"Cannot get stack trace with labels, reason: %s" % str(e),
|
|
536
|
-
CrashWarning)
|
|
530
|
+
warnings.warn("Cannot get stack trace with labels, reason: %s" % str(e), CrashWarning)
|
|
537
531
|
try:
|
|
538
|
-
self.stackTrace
|
|
539
|
-
stackTracePC
|
|
540
|
-
self.stackTracePC
|
|
541
|
-
stackTraceLabels
|
|
542
|
-
for ra in self.stackTracePC ]
|
|
532
|
+
self.stackTrace = thread.get_stack_trace()
|
|
533
|
+
stackTracePC = [ra for (_, ra, _) in self.stackTrace]
|
|
534
|
+
self.stackTracePC = tuple(stackTracePC)
|
|
535
|
+
stackTraceLabels = [process.get_label_at_address(ra) for ra in self.stackTracePC]
|
|
543
536
|
self.stackTraceLabels = tuple(stackTraceLabels)
|
|
544
537
|
except Exception:
|
|
545
538
|
e = sys.exc_info()[1]
|
|
546
|
-
warnings.warn("Cannot get stack trace, reason: %s" % str(e),
|
|
547
|
-
CrashWarning)
|
|
539
|
+
warnings.warn("Cannot get stack trace, reason: %s" % str(e), CrashWarning)
|
|
548
540
|
|
|
549
|
-
def fetch_extra_data(self, event, takeMemorySnapshot
|
|
541
|
+
def fetch_extra_data(self, event, takeMemorySnapshot=0):
|
|
550
542
|
"""
|
|
551
543
|
Fetch extra data from the L{Event} object.
|
|
552
544
|
|
|
@@ -571,25 +563,22 @@ class Crash (object):
|
|
|
571
563
|
|
|
572
564
|
# Get the process and thread, we'll use them below.
|
|
573
565
|
process = event.get_process()
|
|
574
|
-
thread
|
|
566
|
+
thread = event.get_thread()
|
|
575
567
|
|
|
576
568
|
# Get the command line for the target process.
|
|
577
569
|
try:
|
|
578
570
|
self.commandLine = process.get_command_line()
|
|
579
571
|
except Exception:
|
|
580
572
|
e = sys.exc_info()[1]
|
|
581
|
-
warnings.warn("Cannot get command line, reason: %s" % str(e),
|
|
582
|
-
CrashWarning)
|
|
573
|
+
warnings.warn("Cannot get command line, reason: %s" % str(e), CrashWarning)
|
|
583
574
|
|
|
584
575
|
# Get the environment variables for the target process.
|
|
585
576
|
try:
|
|
586
577
|
self.environmentData = process.get_environment_data()
|
|
587
|
-
self.environment
|
|
588
|
-
self.environmentData)
|
|
578
|
+
self.environment = process.parse_environment_data(self.environmentData)
|
|
589
579
|
except Exception:
|
|
590
580
|
e = sys.exc_info()[1]
|
|
591
|
-
warnings.warn("Cannot get environment, reason: %s" % str(e),
|
|
592
|
-
CrashWarning)
|
|
581
|
+
warnings.warn("Cannot get environment, reason: %s" % str(e), CrashWarning)
|
|
593
582
|
|
|
594
583
|
# Data pointed to by registers.
|
|
595
584
|
self.registersPeek = thread.peek_pointers_in_registers()
|
|
@@ -605,8 +594,7 @@ class Crash (object):
|
|
|
605
594
|
self.stackRange = thread.get_stack_range()
|
|
606
595
|
except Exception:
|
|
607
596
|
e = sys.exc_info()[1]
|
|
608
|
-
warnings.warn("Cannot get stack range, reason: %s" % str(e),
|
|
609
|
-
CrashWarning)
|
|
597
|
+
warnings.warn("Cannot get stack range, reason: %s" % str(e), CrashWarning)
|
|
610
598
|
try:
|
|
611
599
|
self.stackFrame = thread.get_stack_frame()
|
|
612
600
|
stackFrame = self.stackFrame
|
|
@@ -617,29 +605,27 @@ class Crash (object):
|
|
|
617
605
|
self.stackPeek = process.peek_pointers_in_data(stackFrame)
|
|
618
606
|
|
|
619
607
|
# Code being executed.
|
|
620
|
-
self.faultCode
|
|
608
|
+
self.faultCode = thread.peek_code_bytes()
|
|
621
609
|
try:
|
|
622
610
|
self.faultDisasm = thread.disassemble_around_pc(32)
|
|
623
611
|
except Exception:
|
|
624
612
|
e = sys.exc_info()[1]
|
|
625
|
-
warnings.warn("Cannot disassemble, reason: %s" % str(e),
|
|
626
|
-
CrashWarning)
|
|
613
|
+
warnings.warn("Cannot disassemble, reason: %s" % str(e), CrashWarning)
|
|
627
614
|
|
|
628
615
|
# For memory related exceptions, get the memory contents
|
|
629
616
|
# of the location that caused the exception to be raised.
|
|
630
617
|
if self.eventCode == win32.EXCEPTION_DEBUG_EVENT:
|
|
631
618
|
if self.pc != self.exceptionAddress and self.exceptionCode in (
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
619
|
+
win32.EXCEPTION_ACCESS_VIOLATION,
|
|
620
|
+
win32.EXCEPTION_ARRAY_BOUNDS_EXCEEDED,
|
|
621
|
+
win32.EXCEPTION_DATATYPE_MISALIGNMENT,
|
|
622
|
+
win32.EXCEPTION_IN_PAGE_ERROR,
|
|
623
|
+
win32.EXCEPTION_STACK_OVERFLOW,
|
|
624
|
+
win32.EXCEPTION_GUARD_PAGE,
|
|
625
|
+
):
|
|
639
626
|
self.faultMem = process.peek(self.exceptionAddress, 64)
|
|
640
627
|
if self.faultMem:
|
|
641
|
-
self.faultPeek = process.peek_pointers_in_data(
|
|
642
|
-
self.faultMem)
|
|
628
|
+
self.faultPeek = process.peek_pointers_in_data(self.faultMem)
|
|
643
629
|
|
|
644
630
|
# TODO: maybe add names and versions of DLLs and EXE?
|
|
645
631
|
|
|
@@ -650,7 +636,7 @@ class Crash (object):
|
|
|
650
636
|
mappedFilenames = process.get_mapped_filenames(self.memoryMap)
|
|
651
637
|
for mbi in self.memoryMap:
|
|
652
638
|
mbi.filename = mappedFilenames.get(mbi.BaseAddress, None)
|
|
653
|
-
mbi.content
|
|
639
|
+
mbi.content = None
|
|
654
640
|
elif takeMemorySnapshot == 2:
|
|
655
641
|
self.memoryMap = process.take_memory_snapshot()
|
|
656
642
|
elif takeMemorySnapshot == 3:
|
|
@@ -664,9 +650,9 @@ class Crash (object):
|
|
|
664
650
|
@rtype: int
|
|
665
651
|
"""
|
|
666
652
|
try:
|
|
667
|
-
return self.registers[
|
|
653
|
+
return self.registers["Eip"] # i386
|
|
668
654
|
except KeyError:
|
|
669
|
-
return self.registers[
|
|
655
|
+
return self.registers["Rip"] # amd64
|
|
670
656
|
|
|
671
657
|
@property
|
|
672
658
|
def sp(self):
|
|
@@ -676,9 +662,9 @@ class Crash (object):
|
|
|
676
662
|
@rtype: int
|
|
677
663
|
"""
|
|
678
664
|
try:
|
|
679
|
-
return self.registers[
|
|
665
|
+
return self.registers["Esp"] # i386
|
|
680
666
|
except KeyError:
|
|
681
|
-
return self.registers[
|
|
667
|
+
return self.registers["Rsp"] # amd64
|
|
682
668
|
|
|
683
669
|
@property
|
|
684
670
|
def fp(self):
|
|
@@ -688,9 +674,9 @@ class Crash (object):
|
|
|
688
674
|
@rtype: int
|
|
689
675
|
"""
|
|
690
676
|
try:
|
|
691
|
-
return self.registers[
|
|
677
|
+
return self.registers["Ebp"] # i386
|
|
692
678
|
except KeyError:
|
|
693
|
-
return self.registers[
|
|
679
|
+
return self.registers["Rbp"] # amd64
|
|
694
680
|
|
|
695
681
|
def __str__(self):
|
|
696
682
|
return self.fullReport()
|
|
@@ -699,8 +685,7 @@ class Crash (object):
|
|
|
699
685
|
"""
|
|
700
686
|
Alias of L{signature}. Deprecated since WinAppDbg 1.5.
|
|
701
687
|
"""
|
|
702
|
-
warnings.warn("Crash.key() method was deprecated in WinAppDbg 1.5",
|
|
703
|
-
DeprecationWarning)
|
|
688
|
+
warnings.warn("Crash.key() method was deprecated in WinAppDbg 1.5", DeprecationWarning)
|
|
704
689
|
return self.signature
|
|
705
690
|
|
|
706
691
|
@property
|
|
@@ -713,14 +698,14 @@ class Crash (object):
|
|
|
713
698
|
trace = self.stackTraceLabels
|
|
714
699
|
else:
|
|
715
700
|
trace = self.stackTracePC
|
|
716
|
-
return
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
701
|
+
return (
|
|
702
|
+
self.arch,
|
|
703
|
+
self.eventCode,
|
|
704
|
+
self.exceptionCode,
|
|
705
|
+
pc,
|
|
706
|
+
trace,
|
|
707
|
+
self.debugString,
|
|
708
|
+
)
|
|
724
709
|
# TODO
|
|
725
710
|
# add the name and version of the binary where the crash happened?
|
|
726
711
|
|
|
@@ -770,47 +755,95 @@ class Crash (object):
|
|
|
770
755
|
return ("Exploitable", "StackPointerCorruption", "Stack pointer corruption is considered exploitable.")
|
|
771
756
|
|
|
772
757
|
if self.exceptionCode == win32.EXCEPTION_ILLEGAL_INSTRUCTION:
|
|
773
|
-
return (
|
|
758
|
+
return (
|
|
759
|
+
"Exploitable",
|
|
760
|
+
"IllegalInstruction",
|
|
761
|
+
"An illegal instruction exception indicates that the attacker controls execution flow.",
|
|
762
|
+
)
|
|
774
763
|
|
|
775
764
|
if self.exceptionCode == win32.EXCEPTION_PRIV_INSTRUCTION:
|
|
776
|
-
return (
|
|
765
|
+
return (
|
|
766
|
+
"Exploitable",
|
|
767
|
+
"PrivilegedInstruction",
|
|
768
|
+
"A privileged instruction exception indicates that the attacker controls execution flow.",
|
|
769
|
+
)
|
|
777
770
|
|
|
778
771
|
if self.exceptionCode == win32.EXCEPTION_GUARD_PAGE:
|
|
779
|
-
return (
|
|
772
|
+
return (
|
|
773
|
+
"Exploitable",
|
|
774
|
+
"GuardPage",
|
|
775
|
+
"A guard page violation indicates a stack overflow has occured, and the stack of another thread was reached (possibly the overflow length is not controlled by the attacker).",
|
|
776
|
+
)
|
|
780
777
|
|
|
781
778
|
if self.exceptionCode == win32.STATUS_STACK_BUFFER_OVERRUN:
|
|
782
|
-
return (
|
|
779
|
+
return (
|
|
780
|
+
"Exploitable",
|
|
781
|
+
"GSViolation",
|
|
782
|
+
"An overrun of a protected stack buffer has been detected. This is considered exploitable, and must be fixed.",
|
|
783
|
+
)
|
|
783
784
|
|
|
784
785
|
if self.exceptionCode == win32.STATUS_HEAP_CORRUPTION:
|
|
785
|
-
return (
|
|
786
|
+
return (
|
|
787
|
+
"Exploitable",
|
|
788
|
+
"HeapCorruption",
|
|
789
|
+
"Heap Corruption has been detected. This is considered exploitable, and must be fixed.",
|
|
790
|
+
)
|
|
786
791
|
|
|
787
792
|
if self.exceptionCode == win32.EXCEPTION_ACCESS_VIOLATION:
|
|
788
|
-
nearNull
|
|
789
|
-
controlFlow
|
|
793
|
+
nearNull = self.faultAddress is None or MemoryAddresses.align_address_to_page_start(self.faultAddress) == 0
|
|
794
|
+
controlFlow = self.__is_control_flow()
|
|
790
795
|
blockDataMove = self.__is_block_data_move()
|
|
791
796
|
if self.faultType == win32.EXCEPTION_EXECUTE_FAULT:
|
|
792
797
|
if nearNull:
|
|
793
|
-
return (
|
|
798
|
+
return (
|
|
799
|
+
"Probably exploitable",
|
|
800
|
+
"DEPViolation",
|
|
801
|
+
"User mode DEP access violations are probably exploitable if near NULL.",
|
|
802
|
+
)
|
|
794
803
|
else:
|
|
795
804
|
return ("Exploitable", "DEPViolation", "User mode DEP access violations are exploitable.")
|
|
796
805
|
elif self.faultType == win32.EXCEPTION_WRITE_FAULT:
|
|
797
806
|
if nearNull:
|
|
798
|
-
return (
|
|
807
|
+
return (
|
|
808
|
+
"Probably exploitable",
|
|
809
|
+
"WriteAV",
|
|
810
|
+
"User mode write access violations that are near NULL are probably exploitable.",
|
|
811
|
+
)
|
|
799
812
|
else:
|
|
800
813
|
return ("Exploitable", "WriteAV", "User mode write access violations that are not near NULL are exploitable.")
|
|
801
814
|
elif self.faultType == win32.EXCEPTION_READ_FAULT:
|
|
802
815
|
if self.faultAddress == self.pc:
|
|
803
816
|
if nearNull:
|
|
804
|
-
return (
|
|
817
|
+
return (
|
|
818
|
+
"Probably exploitable",
|
|
819
|
+
"ReadAVonIP",
|
|
820
|
+
"Access violations at the instruction pointer are probably exploitable if near NULL.",
|
|
821
|
+
)
|
|
805
822
|
else:
|
|
806
|
-
return (
|
|
823
|
+
return (
|
|
824
|
+
"Exploitable",
|
|
825
|
+
"ReadAVonIP",
|
|
826
|
+
"Access violations at the instruction pointer are exploitable if not near NULL.",
|
|
827
|
+
)
|
|
807
828
|
if controlFlow:
|
|
808
829
|
if nearNull:
|
|
809
|
-
return (
|
|
830
|
+
return (
|
|
831
|
+
"Probably exploitable",
|
|
832
|
+
"ReadAVonControlFlow",
|
|
833
|
+
"Access violations near null in control flow instructions are considered probably exploitable.",
|
|
834
|
+
)
|
|
810
835
|
else:
|
|
811
|
-
return (
|
|
836
|
+
return (
|
|
837
|
+
"Exploitable",
|
|
838
|
+
"ReadAVonControlFlow",
|
|
839
|
+
"Access violations not near null in control flow instructions are considered exploitable.",
|
|
840
|
+
)
|
|
812
841
|
if blockDataMove:
|
|
813
|
-
return (
|
|
842
|
+
return (
|
|
843
|
+
"Probably exploitable",
|
|
844
|
+
"ReadAVonBlockMove",
|
|
845
|
+
"This is a read access violation in a block data move, and is therefore classified as probably exploitable.",
|
|
846
|
+
)
|
|
814
847
|
|
|
815
848
|
# Rule: Tainted information used to control branch addresses is considered probably exploitable
|
|
816
849
|
# Rule: Tainted information used to control the target of a later write is probably exploitable
|
|
@@ -826,7 +859,11 @@ class Crash (object):
|
|
|
826
859
|
if self.exceptionCode == win32.EXCEPTION_ACCESS_VIOLATION:
|
|
827
860
|
if self.faultType == win32.EXCEPTION_READ_FAULT:
|
|
828
861
|
if nearNull:
|
|
829
|
-
result = (
|
|
862
|
+
result = (
|
|
863
|
+
"Not likely exploitable",
|
|
864
|
+
"ReadAVNearNull",
|
|
865
|
+
"This is a user mode read access violation near null, and is probably not exploitable.",
|
|
866
|
+
)
|
|
830
867
|
|
|
831
868
|
elif self.exceptionCode == win32.EXCEPTION_INT_DIVIDE_BY_ZERO:
|
|
832
869
|
result = ("Not likely exploitable", "DivideByZero", "This is an integer divide by zero, and is probably not exploitable.")
|
|
@@ -835,7 +872,11 @@ class Crash (object):
|
|
|
835
872
|
result = ("Not likely exploitable", "DivideByZero", "This is a floating point divide by zero, and is probably not exploitable.")
|
|
836
873
|
|
|
837
874
|
elif self.exceptionCode in (win32.EXCEPTION_BREAKPOINT, win32.STATUS_WX86_BREAKPOINT):
|
|
838
|
-
result = (
|
|
875
|
+
result = (
|
|
876
|
+
"Unknown",
|
|
877
|
+
"Breakpoint",
|
|
878
|
+
"While a breakpoint itself is probably not exploitable, it may also be an indication that an attacker is testing a target. In either case breakpoints should not exist in production code.",
|
|
879
|
+
)
|
|
839
880
|
|
|
840
881
|
# Rule: If the stack contains unknown symbols in user mode, call that out
|
|
841
882
|
# Rule: Tainted information used to control the source of a later block move unknown, but called out explicitly
|
|
@@ -852,15 +893,43 @@ class Crash (object):
|
|
|
852
893
|
Currently only works for x86 and amd64 architectures.
|
|
853
894
|
"""
|
|
854
895
|
jump_instructions = (
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
896
|
+
"jmp",
|
|
897
|
+
"jecxz",
|
|
898
|
+
"jcxz",
|
|
899
|
+
"ja",
|
|
900
|
+
"jnbe",
|
|
901
|
+
"jae",
|
|
902
|
+
"jnb",
|
|
903
|
+
"jb",
|
|
904
|
+
"jnae",
|
|
905
|
+
"jbe",
|
|
906
|
+
"jna",
|
|
907
|
+
"jc",
|
|
908
|
+
"je",
|
|
909
|
+
"jz",
|
|
910
|
+
"jnc",
|
|
911
|
+
"jne",
|
|
912
|
+
"jnz",
|
|
913
|
+
"jnp",
|
|
914
|
+
"jpo",
|
|
915
|
+
"jp",
|
|
916
|
+
"jpe",
|
|
917
|
+
"jg",
|
|
918
|
+
"jnle",
|
|
919
|
+
"jge",
|
|
920
|
+
"jnl",
|
|
921
|
+
"jl",
|
|
922
|
+
"jnge",
|
|
923
|
+
"jle",
|
|
924
|
+
"jng",
|
|
925
|
+
"jno",
|
|
926
|
+
"jns",
|
|
927
|
+
"jo",
|
|
928
|
+
"js",
|
|
859
929
|
)
|
|
860
|
-
call_instructions = (
|
|
861
|
-
loop_instructions = (
|
|
862
|
-
control_flow_instructions = call_instructions + loop_instructions +
|
|
863
|
-
jump_instructions
|
|
930
|
+
call_instructions = ("call", "ret", "retn")
|
|
931
|
+
loop_instructions = ("loop", "loopz", "loopnz", "loope", "loopne")
|
|
932
|
+
control_flow_instructions = call_instructions + loop_instructions + jump_instructions
|
|
864
933
|
isControlFlow = False
|
|
865
934
|
instruction = None
|
|
866
935
|
if self.pc is not None and self.faultDisasm:
|
|
@@ -882,7 +951,7 @@ class Crash (object):
|
|
|
882
951
|
|
|
883
952
|
Currently only works for x86 and amd64 architectures.
|
|
884
953
|
"""
|
|
885
|
-
block_data_move_instructions = (
|
|
954
|
+
block_data_move_instructions = ("movs", "stos", "lods")
|
|
886
955
|
isBlockDataMove = False
|
|
887
956
|
instruction = None
|
|
888
957
|
if self.pc is not None and self.faultDisasm:
|
|
@@ -915,12 +984,11 @@ class Crash (object):
|
|
|
915
984
|
elif self.exceptionName:
|
|
916
985
|
what = self.exceptionName
|
|
917
986
|
else:
|
|
918
|
-
what = "Exception %s" %
|
|
919
|
-
HexDump.integer(self.exceptionCode, self.bits)
|
|
987
|
+
what = "Exception %s" % HexDump.integer(self.exceptionCode, self.bits)
|
|
920
988
|
if self.firstChance:
|
|
921
|
-
chance =
|
|
989
|
+
chance = "first"
|
|
922
990
|
else:
|
|
923
|
-
chance =
|
|
991
|
+
chance = "second"
|
|
924
992
|
if self.exceptionLabel:
|
|
925
993
|
where = self.exceptionLabel
|
|
926
994
|
elif self.exceptionAddress:
|
|
@@ -941,14 +1009,10 @@ class Crash (object):
|
|
|
941
1009
|
where = self.labelPC
|
|
942
1010
|
else:
|
|
943
1011
|
where = HexDump.address(self.pc, self.bits)
|
|
944
|
-
msg = "%s (%s) at %s" % (
|
|
945
|
-
self.eventName,
|
|
946
|
-
HexDump.integer(self.eventCode, self.bits),
|
|
947
|
-
where
|
|
948
|
-
)
|
|
1012
|
+
msg = "%s (%s) at %s" % (self.eventName, HexDump.integer(self.eventCode, self.bits), where)
|
|
949
1013
|
return msg
|
|
950
1014
|
|
|
951
|
-
def fullReport(self, bShowNotes
|
|
1015
|
+
def fullReport(self, bShowNotes=True):
|
|
952
1016
|
"""
|
|
953
1017
|
@type bShowNotes: bool
|
|
954
1018
|
@param bShowNotes: C{True} to show the user notes, C{False} otherwise.
|
|
@@ -956,8 +1020,8 @@ class Crash (object):
|
|
|
956
1020
|
@rtype: str
|
|
957
1021
|
@return: Long description of the event.
|
|
958
1022
|
"""
|
|
959
|
-
msg
|
|
960
|
-
msg +=
|
|
1023
|
+
msg = self.briefReport()
|
|
1024
|
+
msg += "\n"
|
|
961
1025
|
|
|
962
1026
|
if self.bits == 32:
|
|
963
1027
|
width = 16
|
|
@@ -966,89 +1030,76 @@ class Crash (object):
|
|
|
966
1030
|
|
|
967
1031
|
if self.eventCode == win32.EXCEPTION_DEBUG_EVENT:
|
|
968
1032
|
(exploitability, expcode, expdescription) = self.isExploitable()
|
|
969
|
-
msg +=
|
|
970
|
-
msg +=
|
|
1033
|
+
msg += "\nSecurity risk level: %s\n" % exploitability
|
|
1034
|
+
msg += " %s\n" % expdescription
|
|
971
1035
|
|
|
972
1036
|
if bShowNotes and self.notes:
|
|
973
|
-
msg +=
|
|
1037
|
+
msg += "\nNotes:\n"
|
|
974
1038
|
msg += self.notesReport()
|
|
975
1039
|
|
|
976
1040
|
if self.commandLine:
|
|
977
|
-
msg +=
|
|
1041
|
+
msg += "\nCommand line: %s\n" % self.commandLine
|
|
978
1042
|
|
|
979
1043
|
if self.environment:
|
|
980
|
-
msg +=
|
|
1044
|
+
msg += "\nEnvironment:\n"
|
|
981
1045
|
msg += self.environmentReport()
|
|
982
1046
|
|
|
983
1047
|
if not self.labelPC:
|
|
984
1048
|
base = HexDump.address(self.lpBaseOfDll, self.bits)
|
|
985
1049
|
if self.modFileName:
|
|
986
|
-
fn
|
|
987
|
-
msg +=
|
|
1050
|
+
fn = PathOperations.pathname_to_filename(self.modFileName)
|
|
1051
|
+
msg += "\nRunning in %s (%s)\n" % (fn, base)
|
|
988
1052
|
else:
|
|
989
|
-
msg +=
|
|
1053
|
+
msg += "\nRunning in module at %s\n" % base
|
|
990
1054
|
|
|
991
1055
|
if self.registers:
|
|
992
|
-
msg +=
|
|
1056
|
+
msg += "\nRegisters:\n"
|
|
993
1057
|
msg += CrashDump.dump_registers(self.registers)
|
|
994
1058
|
if self.registersPeek:
|
|
995
|
-
msg +=
|
|
996
|
-
msg += CrashDump.dump_registers_peek(self.registers,
|
|
997
|
-
self.registersPeek,
|
|
998
|
-
width = width)
|
|
1059
|
+
msg += "\n"
|
|
1060
|
+
msg += CrashDump.dump_registers_peek(self.registers, self.registersPeek, width=width)
|
|
999
1061
|
|
|
1000
1062
|
if self.faultDisasm:
|
|
1001
|
-
msg +=
|
|
1002
|
-
msg += CrashDump.dump_code(self.faultDisasm, self.pc,
|
|
1003
|
-
bits = self.bits)
|
|
1063
|
+
msg += "\nCode disassembly:\n"
|
|
1064
|
+
msg += CrashDump.dump_code(self.faultDisasm, self.pc, bits=self.bits)
|
|
1004
1065
|
|
|
1005
1066
|
if self.stackTrace:
|
|
1006
|
-
msg +=
|
|
1067
|
+
msg += "\nStack trace:\n"
|
|
1007
1068
|
if self.stackTracePretty:
|
|
1008
|
-
msg += CrashDump.dump_stack_trace_with_labels(
|
|
1009
|
-
self.stackTracePretty,
|
|
1010
|
-
bits = self.bits)
|
|
1069
|
+
msg += CrashDump.dump_stack_trace_with_labels(self.stackTracePretty, bits=self.bits)
|
|
1011
1070
|
else:
|
|
1012
|
-
msg += CrashDump.dump_stack_trace(self.stackTrace,
|
|
1013
|
-
bits = self.bits)
|
|
1071
|
+
msg += CrashDump.dump_stack_trace(self.stackTrace, bits=self.bits)
|
|
1014
1072
|
|
|
1015
1073
|
if self.stackFrame:
|
|
1016
1074
|
if self.stackPeek:
|
|
1017
|
-
msg +=
|
|
1018
|
-
msg += CrashDump.dump_stack_peek(self.stackPeek, width
|
|
1019
|
-
msg +=
|
|
1020
|
-
msg += HexDump.hexblock(self.stackFrame, self.sp,
|
|
1021
|
-
bits = self.bits, width = width)
|
|
1075
|
+
msg += "\nStack pointers:\n"
|
|
1076
|
+
msg += CrashDump.dump_stack_peek(self.stackPeek, width=width)
|
|
1077
|
+
msg += "\nStack dump:\n"
|
|
1078
|
+
msg += HexDump.hexblock(self.stackFrame, self.sp, bits=self.bits, width=width)
|
|
1022
1079
|
|
|
1023
1080
|
if self.faultCode and not self.modFileName:
|
|
1024
|
-
msg +=
|
|
1025
|
-
msg += HexDump.hexblock(self.faultCode, self.pc,
|
|
1026
|
-
bits = self.bits, width = width)
|
|
1081
|
+
msg += "\nCode dump:\n"
|
|
1082
|
+
msg += HexDump.hexblock(self.faultCode, self.pc, bits=self.bits, width=width)
|
|
1027
1083
|
|
|
1028
1084
|
if self.faultMem:
|
|
1029
1085
|
if self.faultPeek:
|
|
1030
|
-
msg +=
|
|
1031
|
-
msg += CrashDump.dump_data_peek(self.faultPeek,
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
width = width)
|
|
1035
|
-
msg += '\nException address dump:\n'
|
|
1036
|
-
msg += HexDump.hexblock(self.faultMem, self.exceptionAddress,
|
|
1037
|
-
bits = self.bits, width = width)
|
|
1086
|
+
msg += "\nException address pointers:\n"
|
|
1087
|
+
msg += CrashDump.dump_data_peek(self.faultPeek, self.exceptionAddress, bits=self.bits, width=width)
|
|
1088
|
+
msg += "\nException address dump:\n"
|
|
1089
|
+
msg += HexDump.hexblock(self.faultMem, self.exceptionAddress, bits=self.bits, width=width)
|
|
1038
1090
|
|
|
1039
1091
|
if self.memoryMap:
|
|
1040
|
-
msg +=
|
|
1092
|
+
msg += "\nMemory map:\n"
|
|
1041
1093
|
mappedFileNames = dict()
|
|
1042
1094
|
for mbi in self.memoryMap:
|
|
1043
|
-
if hasattr(mbi,
|
|
1095
|
+
if hasattr(mbi, "filename") and mbi.filename:
|
|
1044
1096
|
mappedFileNames[mbi.BaseAddress] = mbi.filename
|
|
1045
|
-
msg += CrashDump.dump_memory_map(self.memoryMap, mappedFileNames,
|
|
1046
|
-
bits = self.bits)
|
|
1097
|
+
msg += CrashDump.dump_memory_map(self.memoryMap, mappedFileNames, bits=self.bits)
|
|
1047
1098
|
|
|
1048
|
-
if not msg.endswith(
|
|
1049
|
-
if not msg.endswith(
|
|
1050
|
-
msg +=
|
|
1051
|
-
msg +=
|
|
1099
|
+
if not msg.endswith("\n\n"):
|
|
1100
|
+
if not msg.endswith("\n"):
|
|
1101
|
+
msg += "\n"
|
|
1102
|
+
msg += "\n"
|
|
1052
1103
|
return msg
|
|
1053
1104
|
|
|
1054
1105
|
def environmentReport(self):
|
|
@@ -1057,10 +1108,10 @@ class Crash (object):
|
|
|
1057
1108
|
@return: The process environment variables,
|
|
1058
1109
|
merged and formatted for a report.
|
|
1059
1110
|
"""
|
|
1060
|
-
msg =
|
|
1111
|
+
msg = ""
|
|
1061
1112
|
if self.environment:
|
|
1062
1113
|
for key, value in compat.iteritems(self.environment):
|
|
1063
|
-
msg +=
|
|
1114
|
+
msg += " %s=%s\n" % (key, value)
|
|
1064
1115
|
return msg
|
|
1065
1116
|
|
|
1066
1117
|
def notesReport(self):
|
|
@@ -1068,17 +1119,17 @@ class Crash (object):
|
|
|
1068
1119
|
@rtype: str
|
|
1069
1120
|
@return: All notes, merged and formatted for a report.
|
|
1070
1121
|
"""
|
|
1071
|
-
msg =
|
|
1122
|
+
msg = ""
|
|
1072
1123
|
if self.notes:
|
|
1073
1124
|
for n in self.notes:
|
|
1074
|
-
n = n.strip(
|
|
1075
|
-
if
|
|
1076
|
-
n = n.strip(
|
|
1077
|
-
msg +=
|
|
1125
|
+
n = n.strip("\n")
|
|
1126
|
+
if "\n" in n:
|
|
1127
|
+
n = n.strip("\n")
|
|
1128
|
+
msg += " * %s\n" % n.pop(0)
|
|
1078
1129
|
for x in n:
|
|
1079
|
-
msg +=
|
|
1130
|
+
msg += " %s\n" % x
|
|
1080
1131
|
else:
|
|
1081
|
-
msg +=
|
|
1132
|
+
msg += " * %s\n" % n
|
|
1082
1133
|
return msg
|
|
1083
1134
|
|
|
1084
1135
|
def addNote(self, msg):
|
|
@@ -1119,11 +1170,13 @@ class Crash (object):
|
|
|
1119
1170
|
@rtype: bool
|
|
1120
1171
|
@return: C{True} if there are notes for this crash event.
|
|
1121
1172
|
"""
|
|
1122
|
-
return bool(
|
|
1173
|
+
return bool(self.notes)
|
|
1174
|
+
|
|
1123
1175
|
|
|
1124
|
-
|
|
1176
|
+
# ==============================================================================
|
|
1125
1177
|
|
|
1126
|
-
|
|
1178
|
+
|
|
1179
|
+
class CrashContainer(object):
|
|
1127
1180
|
"""
|
|
1128
1181
|
Old crash dump persistencer using a DBM database.
|
|
1129
1182
|
Doesn't support duplicate crashes.
|
|
@@ -1181,16 +1234,16 @@ class CrashContainer (object):
|
|
|
1181
1234
|
C{buffer} type), C{False} to use text marshalled values (C{str} type).
|
|
1182
1235
|
"""
|
|
1183
1236
|
|
|
1184
|
-
optimizeKeys
|
|
1185
|
-
optimizeValues
|
|
1186
|
-
compressKeys
|
|
1187
|
-
compressValues
|
|
1188
|
-
escapeKeys
|
|
1189
|
-
escapeValues
|
|
1190
|
-
binaryKeys
|
|
1191
|
-
binaryValues
|
|
1237
|
+
optimizeKeys = False
|
|
1238
|
+
optimizeValues = True
|
|
1239
|
+
compressKeys = False
|
|
1240
|
+
compressValues = True
|
|
1241
|
+
escapeKeys = False
|
|
1242
|
+
escapeValues = False
|
|
1243
|
+
binaryKeys = False
|
|
1244
|
+
binaryValues = False
|
|
1192
1245
|
|
|
1193
|
-
def __init__(self, filename
|
|
1246
|
+
def __init__(self, filename=None, allowRepeatedKeys=False):
|
|
1194
1247
|
"""
|
|
1195
1248
|
@type filename: str
|
|
1196
1249
|
@param filename: (Optional) File name for crash database.
|
|
@@ -1210,9 +1263,8 @@ class CrashContainer (object):
|
|
|
1210
1263
|
global anydbm
|
|
1211
1264
|
if not anydbm:
|
|
1212
1265
|
import anydbm
|
|
1213
|
-
self.__db = anydbm.open(filename,
|
|
1214
|
-
self.__keys = dict([
|
|
1215
|
-
for mk in self.__db.keys() ])
|
|
1266
|
+
self.__db = anydbm.open(filename, "c")
|
|
1267
|
+
self.__keys = dict([(self.unmarshall_key(mk), mk) for mk in self.__db.keys()])
|
|
1216
1268
|
else:
|
|
1217
1269
|
self.__db = dict()
|
|
1218
1270
|
self.__keys = dict()
|
|
@@ -1240,11 +1292,11 @@ class CrashContainer (object):
|
|
|
1240
1292
|
"""
|
|
1241
1293
|
if key in self.__keys:
|
|
1242
1294
|
return self.__keys[key]
|
|
1243
|
-
skey = pickle.dumps(key, protocol
|
|
1295
|
+
skey = pickle.dumps(key, protocol=0)
|
|
1244
1296
|
if self.compressKeys:
|
|
1245
1297
|
skey = zlib.compress(skey, zlib.Z_BEST_COMPRESSION)
|
|
1246
1298
|
if self.escapeKeys:
|
|
1247
|
-
skey = skey.encode(
|
|
1299
|
+
skey = skey.encode("hex")
|
|
1248
1300
|
if self.binaryKeys:
|
|
1249
1301
|
skey = buffer(skey)
|
|
1250
1302
|
self.__keys[key] = skey
|
|
@@ -1262,13 +1314,13 @@ class CrashContainer (object):
|
|
|
1262
1314
|
"""
|
|
1263
1315
|
key = str(key)
|
|
1264
1316
|
if self.escapeKeys:
|
|
1265
|
-
key = key.decode(
|
|
1317
|
+
key = key.decode("hex")
|
|
1266
1318
|
if self.compressKeys:
|
|
1267
1319
|
key = zlib.decompress(key)
|
|
1268
1320
|
key = pickle.loads(key)
|
|
1269
1321
|
return key
|
|
1270
1322
|
|
|
1271
|
-
def marshall_value(self, value, storeMemoryMap
|
|
1323
|
+
def marshall_value(self, value, storeMemoryMap=False):
|
|
1272
1324
|
"""
|
|
1273
1325
|
Marshalls a Crash object to be used in the database.
|
|
1274
1326
|
By default the C{memoryMap} member is B{NOT} stored here.
|
|
@@ -1286,7 +1338,7 @@ class CrashContainer (object):
|
|
|
1286
1338
|
@rtype: str
|
|
1287
1339
|
@return: Converted object.
|
|
1288
1340
|
"""
|
|
1289
|
-
if hasattr(value,
|
|
1341
|
+
if hasattr(value, "memoryMap"):
|
|
1290
1342
|
crash = value
|
|
1291
1343
|
memoryMap = crash.memoryMap
|
|
1292
1344
|
try:
|
|
@@ -1295,10 +1347,10 @@ class CrashContainer (object):
|
|
|
1295
1347
|
# convert the generator to a list
|
|
1296
1348
|
crash.memoryMap = list(memoryMap)
|
|
1297
1349
|
if self.optimizeValues:
|
|
1298
|
-
value = pickle.dumps(crash, protocol
|
|
1350
|
+
value = pickle.dumps(crash, protocol=HIGHEST_PROTOCOL)
|
|
1299
1351
|
value = optimize(value)
|
|
1300
1352
|
else:
|
|
1301
|
-
value = pickle.dumps(crash, protocol
|
|
1353
|
+
value = pickle.dumps(crash, protocol=0)
|
|
1302
1354
|
finally:
|
|
1303
1355
|
crash.memoryMap = memoryMap
|
|
1304
1356
|
del memoryMap
|
|
@@ -1306,7 +1358,7 @@ class CrashContainer (object):
|
|
|
1306
1358
|
if self.compressValues:
|
|
1307
1359
|
value = zlib.compress(value, zlib.Z_BEST_COMPRESSION)
|
|
1308
1360
|
if self.escapeValues:
|
|
1309
|
-
value = value.encode(
|
|
1361
|
+
value = value.encode("hex")
|
|
1310
1362
|
if self.binaryValues:
|
|
1311
1363
|
value = buffer(value)
|
|
1312
1364
|
return value
|
|
@@ -1323,7 +1375,7 @@ class CrashContainer (object):
|
|
|
1323
1375
|
"""
|
|
1324
1376
|
value = str(value)
|
|
1325
1377
|
if self.escapeValues:
|
|
1326
|
-
value = value.decode(
|
|
1378
|
+
value = value.decode("hex")
|
|
1327
1379
|
if self.compressValues:
|
|
1328
1380
|
value = zlib.decompress(value)
|
|
1329
1381
|
value = pickle.loads(value)
|
|
@@ -1357,7 +1409,7 @@ class CrashContainer (object):
|
|
|
1357
1409
|
@return:
|
|
1358
1410
|
C{True} if a Crash object with the same key is in the container.
|
|
1359
1411
|
"""
|
|
1360
|
-
return self.has_key(
|
|
1412
|
+
return self.has_key(crash.key())
|
|
1361
1413
|
|
|
1362
1414
|
def has_key(self, key):
|
|
1363
1415
|
"""
|
|
@@ -1376,7 +1428,7 @@ class CrashContainer (object):
|
|
|
1376
1428
|
"""
|
|
1377
1429
|
return compat.iterkeys(self.__keys)
|
|
1378
1430
|
|
|
1379
|
-
class __CrashContainerIterator
|
|
1431
|
+
class __CrashContainerIterator(object):
|
|
1380
1432
|
"""
|
|
1381
1433
|
Iterator of Crash objects. Returned by L{CrashContainer.__iter__}.
|
|
1382
1434
|
"""
|
|
@@ -1402,7 +1454,7 @@ class CrashContainer (object):
|
|
|
1402
1454
|
@return: A B{copy} of a Crash object in the L{CrashContainer}.
|
|
1403
1455
|
@raise StopIteration: No more items left.
|
|
1404
1456
|
"""
|
|
1405
|
-
key
|
|
1457
|
+
key = self.__keys_iter.next()
|
|
1406
1458
|
return self.__container.get(key)
|
|
1407
1459
|
|
|
1408
1460
|
def __del__(self):
|
|
@@ -1447,9 +1499,9 @@ class CrashContainer (object):
|
|
|
1447
1499
|
@param crash: Crash object to add.
|
|
1448
1500
|
"""
|
|
1449
1501
|
if crash not in self:
|
|
1450
|
-
key
|
|
1502
|
+
key = crash.key()
|
|
1451
1503
|
skey = self.marshall_key(key)
|
|
1452
|
-
data = self.marshall_value(crash, storeMemoryMap
|
|
1504
|
+
data = self.marshall_value(crash, storeMemoryMap=True)
|
|
1453
1505
|
self.__db[skey] = data
|
|
1454
1506
|
|
|
1455
1507
|
def __delitem__(self, key):
|
|
@@ -1470,7 +1522,7 @@ class CrashContainer (object):
|
|
|
1470
1522
|
@type crash: L{Crash}
|
|
1471
1523
|
@param crash: Crash object to remove.
|
|
1472
1524
|
"""
|
|
1473
|
-
del self[
|
|
1525
|
+
del self[crash.key()]
|
|
1474
1526
|
|
|
1475
1527
|
def get(self, key):
|
|
1476
1528
|
"""
|
|
@@ -1491,8 +1543,8 @@ class CrashContainer (object):
|
|
|
1491
1543
|
2. Delete the object from the set.
|
|
1492
1544
|
3. Modify the object and add it again.
|
|
1493
1545
|
"""
|
|
1494
|
-
skey
|
|
1495
|
-
data
|
|
1546
|
+
skey = self.marshall_key(key)
|
|
1547
|
+
data = self.__db[skey]
|
|
1496
1548
|
crash = self.unmarshall_value(data)
|
|
1497
1549
|
return crash
|
|
1498
1550
|
|
|
@@ -1517,7 +1569,9 @@ class CrashContainer (object):
|
|
|
1517
1569
|
"""
|
|
1518
1570
|
return self.get(key)
|
|
1519
1571
|
|
|
1520
|
-
|
|
1572
|
+
|
|
1573
|
+
# ==============================================================================
|
|
1574
|
+
|
|
1521
1575
|
|
|
1522
1576
|
class CrashDictionary(object):
|
|
1523
1577
|
"""
|
|
@@ -1526,7 +1580,7 @@ class CrashDictionary(object):
|
|
|
1526
1580
|
Currently the only implementation is through L{sql.CrashDAO}.
|
|
1527
1581
|
"""
|
|
1528
1582
|
|
|
1529
|
-
def __init__(self, url, creator
|
|
1583
|
+
def __init__(self, url, creator=None, allowRepeatedKeys=True):
|
|
1530
1584
|
"""
|
|
1531
1585
|
@type url: str
|
|
1532
1586
|
@param url: Connection URL of the crash database.
|
|
@@ -1599,7 +1653,7 @@ class CrashDictionary(object):
|
|
|
1599
1653
|
@return: Iterator of the contained L{Crash} objects.
|
|
1600
1654
|
"""
|
|
1601
1655
|
offset = 0
|
|
1602
|
-
limit
|
|
1656
|
+
limit = 10
|
|
1603
1657
|
while 1:
|
|
1604
1658
|
found = self._dao.find(offset=offset, limit=limit)
|
|
1605
1659
|
if not found:
|
|
@@ -1621,7 +1675,7 @@ class CrashDictionary(object):
|
|
|
1621
1675
|
@return: Iterator of the contained L{Crash} heuristic signatures.
|
|
1622
1676
|
"""
|
|
1623
1677
|
for crash in self:
|
|
1624
|
-
yield crash.signature
|
|
1678
|
+
yield crash.signature # FIXME this gives repeated results!
|
|
1625
1679
|
|
|
1626
1680
|
def __contains__(self, crash):
|
|
1627
1681
|
"""
|
|
@@ -1655,7 +1709,8 @@ class CrashDictionary(object):
|
|
|
1655
1709
|
@rtype: bool
|
|
1656
1710
|
@return: C{False} if the container is empty.
|
|
1657
1711
|
"""
|
|
1658
|
-
return bool(
|
|
1712
|
+
return bool(len(self))
|
|
1713
|
+
|
|
1659
1714
|
|
|
1660
1715
|
class CrashTable(CrashDictionary):
|
|
1661
1716
|
"""
|
|
@@ -1666,7 +1721,7 @@ class CrashTable(CrashDictionary):
|
|
|
1666
1721
|
New applications should not use this class.
|
|
1667
1722
|
"""
|
|
1668
1723
|
|
|
1669
|
-
def __init__(self, location
|
|
1724
|
+
def __init__(self, location=None, allowRepeatedKeys=True):
|
|
1670
1725
|
"""
|
|
1671
1726
|
@type location: str
|
|
1672
1727
|
@param location: (Optional) Location of the crash database.
|
|
@@ -1683,16 +1738,15 @@ class CrashTable(CrashDictionary):
|
|
|
1683
1738
|
If C{False} any L{Crash} object with the same signature as a
|
|
1684
1739
|
previously existing object will be ignored.
|
|
1685
1740
|
"""
|
|
1686
|
-
warnings.warn(
|
|
1687
|
-
"The %s class is deprecated since WinAppDbg 1.5." % self.__class__,
|
|
1688
|
-
DeprecationWarning)
|
|
1741
|
+
warnings.warn("The %s class is deprecated since WinAppDbg 1.5." % self.__class__, DeprecationWarning)
|
|
1689
1742
|
if location:
|
|
1690
1743
|
url = "sqlite:///%s" % location
|
|
1691
1744
|
else:
|
|
1692
1745
|
url = "sqlite://"
|
|
1693
1746
|
super(CrashTable, self).__init__(url, allowRepeatedKeys)
|
|
1694
1747
|
|
|
1695
|
-
|
|
1748
|
+
|
|
1749
|
+
class CrashTableMSSQL(CrashDictionary):
|
|
1696
1750
|
"""
|
|
1697
1751
|
Old crash dump persistencer using a Microsoft SQL Server database.
|
|
1698
1752
|
|
|
@@ -1701,7 +1755,7 @@ class CrashTableMSSQL (CrashDictionary):
|
|
|
1701
1755
|
New applications should not use this class.
|
|
1702
1756
|
"""
|
|
1703
1757
|
|
|
1704
|
-
def __init__(self, location
|
|
1758
|
+
def __init__(self, location=None, allowRepeatedKeys=True):
|
|
1705
1759
|
"""
|
|
1706
1760
|
@type location: str
|
|
1707
1761
|
@param location: Location of the crash database.
|
|
@@ -1714,14 +1768,14 @@ class CrashTableMSSQL (CrashDictionary):
|
|
|
1714
1768
|
If C{False} any L{Crash} object with the same signature as a
|
|
1715
1769
|
previously existing object will be ignored.
|
|
1716
1770
|
"""
|
|
1717
|
-
warnings.warn(
|
|
1718
|
-
"The %s class is deprecated since WinAppDbg 1.5." % self.__class__,
|
|
1719
|
-
DeprecationWarning)
|
|
1771
|
+
warnings.warn("The %s class is deprecated since WinAppDbg 1.5." % self.__class__, DeprecationWarning)
|
|
1720
1772
|
import urllib
|
|
1773
|
+
|
|
1721
1774
|
url = "mssql+pyodbc:///?odbc_connect=" + urllib.quote_plus(location)
|
|
1722
1775
|
super(CrashTableMSSQL, self).__init__(url, allowRepeatedKeys)
|
|
1723
1776
|
|
|
1724
|
-
|
|
1777
|
+
|
|
1778
|
+
class VolatileCrashContainer(CrashTable):
|
|
1725
1779
|
"""
|
|
1726
1780
|
Old in-memory crash dump storage.
|
|
1727
1781
|
|
|
@@ -1730,7 +1784,7 @@ class VolatileCrashContainer (CrashTable):
|
|
|
1730
1784
|
New applications should not use this class.
|
|
1731
1785
|
"""
|
|
1732
1786
|
|
|
1733
|
-
def __init__(self, allowRepeatedKeys
|
|
1787
|
+
def __init__(self, allowRepeatedKeys=True):
|
|
1734
1788
|
"""
|
|
1735
1789
|
Volatile containers are stored only in memory and
|
|
1736
1790
|
destroyed when they go out of scope.
|
|
@@ -1742,8 +1796,8 @@ class VolatileCrashContainer (CrashTable):
|
|
|
1742
1796
|
If C{False} any L{Crash} object with the same key as a
|
|
1743
1797
|
previously existing object will be ignored.
|
|
1744
1798
|
"""
|
|
1745
|
-
super(VolatileCrashContainer, self).__init__(
|
|
1746
|
-
|
|
1799
|
+
super(VolatileCrashContainer, self).__init__(allowRepeatedKeys=allowRepeatedKeys)
|
|
1800
|
+
|
|
1747
1801
|
|
|
1748
1802
|
class DummyCrashContainer(object):
|
|
1749
1803
|
"""
|
|
@@ -1756,7 +1810,7 @@ class DummyCrashContainer(object):
|
|
|
1756
1810
|
@see: L{CrashDictionary}
|
|
1757
1811
|
"""
|
|
1758
1812
|
|
|
1759
|
-
def __init__(self, allowRepeatedKeys
|
|
1813
|
+
def __init__(self, allowRepeatedKeys=True):
|
|
1760
1814
|
"""
|
|
1761
1815
|
Fake containers don't store L{Crash} objects, but they implement the
|
|
1762
1816
|
interface properly.
|
|
@@ -1765,7 +1819,7 @@ class DummyCrashContainer(object):
|
|
|
1765
1819
|
@param allowRepeatedKeys:
|
|
1766
1820
|
Mimics the duplicate filter behavior found in real containers.
|
|
1767
1821
|
"""
|
|
1768
|
-
self.__keys
|
|
1822
|
+
self.__keys = set()
|
|
1769
1823
|
self.__count = 0
|
|
1770
1824
|
self.__allowRepeatedKeys = allowRepeatedKeys
|
|
1771
1825
|
|
|
@@ -1786,14 +1840,14 @@ class DummyCrashContainer(object):
|
|
|
1786
1840
|
"""
|
|
1787
1841
|
if self.__allowRepeatedKeys:
|
|
1788
1842
|
return self.__count
|
|
1789
|
-
return len(
|
|
1843
|
+
return len(self.__keys)
|
|
1790
1844
|
|
|
1791
1845
|
def __bool__(self):
|
|
1792
1846
|
"""
|
|
1793
1847
|
@rtype: bool
|
|
1794
1848
|
@return: C{False} if the container is empty.
|
|
1795
1849
|
"""
|
|
1796
|
-
return bool(
|
|
1850
|
+
return bool(len(self))
|
|
1797
1851
|
|
|
1798
1852
|
def add(self, crash):
|
|
1799
1853
|
"""
|
|
@@ -1808,7 +1862,7 @@ class DummyCrashContainer(object):
|
|
|
1808
1862
|
@type crash: L{Crash}
|
|
1809
1863
|
@param crash: Crash object to add.
|
|
1810
1864
|
"""
|
|
1811
|
-
self.__keys.add(
|
|
1865
|
+
self.__keys.add(crash.signature)
|
|
1812
1866
|
self.__count += 1
|
|
1813
1867
|
|
|
1814
1868
|
def get(self, key):
|
|
@@ -1825,7 +1879,7 @@ class DummyCrashContainer(object):
|
|
|
1825
1879
|
@rtype: bool
|
|
1826
1880
|
@return: C{True} if a matching L{Crash} object is in the container.
|
|
1827
1881
|
"""
|
|
1828
|
-
return self.__keys.has_key(
|
|
1882
|
+
return self.__keys.has_key(key)
|
|
1829
1883
|
|
|
1830
1884
|
def iterkeys(self):
|
|
1831
1885
|
"""
|
|
@@ -1843,7 +1897,8 @@ class DummyCrashContainer(object):
|
|
|
1843
1897
|
"""
|
|
1844
1898
|
return iter(self.__keys)
|
|
1845
1899
|
|
|
1846
|
-
|
|
1900
|
+
|
|
1901
|
+
# ==============================================================================
|
|
1847
1902
|
# Register the Crash class with the secure serializer.
|
|
1848
1903
|
|
|
1849
1904
|
try:
|