We can't use co_extra for suspend all threads and pausing program, add a flag (PY-22725 )

This commit is contained in:
Elizaveta Shashkova
2017-03-03 11:33:59 +03:00
parent 42cd99e488
commit 34231ffcbb
5 changed files with 1455 additions and 974 deletions
@@ -1,5 +1,5 @@
try:
from _pydevd_frame_eval.pydevd_frame_evaluator import frame_eval_func, stop_frame_eval
from _pydevd_frame_eval.pydevd_frame_evaluator import frame_eval_func, stop_frame_eval, set_use_code_extra
except ImportError:
try:
import struct
@@ -25,6 +25,6 @@ except ImportError:
check_name = '_pydevd_frame_eval.%s' % (mod_name,)
mod = __import__(check_name)
mod = getattr(mod, mod_name)
frame_eval_func, stop_frame_eval = mod.frame_eval_func, mod.stop_frame_eval
frame_eval_func, stop_frame_eval, set_use_code_extra = mod.frame_eval_func, mod.stop_frame_eval, mod.set_use_code_extra
except ImportError:
raise
@@ -7,6 +7,7 @@ if sys.version_info[0] == 3 and sys.version_info[1] == 6:
frame_eval_func = None
stop_frame_eval = None
set_use_code_extra = None
USE_FRAME_EVAL = os.environ.get('PYDEVD_USE_FRAME_EVAL', None)
@@ -16,7 +17,7 @@ if USE_FRAME_EVAL == 'NO':
else:
if IS_PY36:
try:
from _pydevd_frame_eval.pydevd_frame_eval_cython_wrapper import frame_eval_func, stop_frame_eval
from _pydevd_frame_eval.pydevd_frame_eval_cython_wrapper import frame_eval_func, stop_frame_eval, set_use_code_extra
except ImportError:
from _pydev_bundle.pydev_monkey import log_error_once
File diff suppressed because it is too large Load Diff
@@ -15,19 +15,35 @@ AVOID_RECURSION = [
]
get_file_type = DONT_TRACE.get
NO_BREAKS_IN_FRAME = 1
class UseCodeExtraHolder:
use_code_extra = True
def is_use_code_extra():
return UseCodeExtraHolder.use_code_extra
def set_use_code_extra(new_value):
UseCodeExtraHolder.use_code_extra = new_value
cdef PyObject* get_bytecode_while_frame_eval(PyFrameObject *frame_obj, int exc):
frame = <object> frame_obj
cdef str filepath = frame.f_code.co_filename
cdef bint skip_file = exc
cdef void* extra = PyMem_Malloc(sizeof(int))
cdef void* extra = NULL
cdef int* extra_value = NULL
_PyCode_GetExtra(<PyObject*> frame.f_code, 0, &extra)
if extra is not NULL:
extra_value = <int*> extra
if extra_value[0] == 1:
return _PyEval_EvalFrameDefault(frame_obj, exc)
if is_use_code_extra():
extra = PyMem_Malloc(sizeof(int))
_PyCode_GetExtra(<PyObject*> frame.f_code, 0, &extra)
if extra is not NULL:
extra_value = <int*> extra
if extra_value[0] == NO_BREAKS_IN_FRAME:
return _PyEval_EvalFrameDefault(frame_obj, exc)
for file in AVOID_RECURSION:
# we can't call any other function without this check, because we can get stack overflow
@@ -100,7 +116,7 @@ cdef PyObject* get_bytecode_while_frame_eval(PyFrameObject *frame_obj, int exc):
if not was_break:
extra_value = <int*> PyMem_Malloc(sizeof(int))
extra_value[0] = 1
extra_value[0] = NO_BREAKS_IN_FRAME
_PyCode_SetExtra(<PyObject*> code_object, 0, extra_value)
additional_info.is_tracing = False
+2 -1
View File
@@ -36,7 +36,7 @@ from _pydevd_bundle.pydevd_custom_frames import CustomFramesContainer, custom_fr
from _pydevd_bundle.pydevd_frame_utils import add_exception_to_frame
from _pydevd_bundle.pydevd_kill_all_pydevd_threads import kill_all_pydev_threads
from _pydevd_bundle.pydevd_trace_dispatch import trace_dispatch as _trace_dispatch
from _pydevd_frame_eval.pydevd_frame_eval_main import frame_eval_func, stop_frame_eval
from _pydevd_frame_eval.pydevd_frame_eval_main import frame_eval_func, stop_frame_eval, set_use_code_extra
from _pydevd_bundle.pydevd_utils import save_main_module
from pydevd_concurrency_analyser.pydevd_concurrency_logger import ThreadingLogger, AsyncioLogger, send_message, cur_time
from pydevd_concurrency_analyser.pydevd_thread_wrappers import wrap_threads
@@ -674,6 +674,7 @@ class PyDB:
thread_id = get_thread_id(thread)
int_cmd = InternalSetTracingThread(thread_id)
self.post_internal_command(int_cmd, thread_id)
set_use_code_extra(False)
def _send_breakpoint_condition_exception(self, thread):