def make_show_console_message(self, py_db, thread_id, frame):
     try:
         frames_list = pydevd_frame_utils.create_frames_list_from_frame(
             frame)
         thread_suspended_str, _thread_stack_str = self.make_thread_suspend_str(
             py_db, thread_id, frames_list, CMD_SHOW_CONSOLE, '')
         return NetCommand(CMD_SHOW_CONSOLE, 0, thread_suspended_str)
     except:
         return self.make_error_message(0, get_exception_traceback_str())
    def make_get_thread_stack_message(self, py_db, seq, thread_id, topmost_frame, fmt, must_be_suspended=False, start_frame=0, levels=0):
        frames = []
        module_events = []
        if topmost_frame is not None:
            try:
                # : :type suspended_frames_manager: SuspendedFramesManager
                suspended_frames_manager = py_db.suspended_frames_manager
                frames_list = suspended_frames_manager.get_frames_list(thread_id)
                if frames_list is None:
                    # Could not find stack of suspended frame...
                    if must_be_suspended:
                        return None
                    else:
                        frames_list = pydevd_frame_utils.create_frames_list_from_frame(topmost_frame)

                for frame_id, frame, method_name, original_filename, filename_in_utf8, lineno in self._iter_visible_frames_info(
                        py_db, frames_list
                    ):

                    module_name = frame.f_globals.get('__name__', '')

                    module_events.extend(self.modules_manager.track_module(filename_in_utf8, module_name, frame))

                    presentation_hint = None
                    if not getattr(frame, 'IS_PLUGIN_FRAME', False):  # Never filter out plugin frames!
                        if py_db.is_files_filter_enabled and py_db.apply_files_filter(frame, original_filename, False):
                            continue

                        if not py_db.in_project_scope(frame):
                            presentation_hint = 'subtle'

                    formatted_name = self._format_frame_name(fmt, method_name, module_name, lineno, filename_in_utf8)
                    frames.append(pydevd_schema.StackFrame(
                        frame_id, formatted_name, lineno, column=1, source={
                            'path': filename_in_utf8,
                            'sourceReference': pydevd_file_utils.get_client_filename_source_reference(filename_in_utf8),
                        },
                        presentationHint=presentation_hint).to_dict())
            finally:
                topmost_frame = None

        for module_event in module_events:
            py_db.writer.add_command(module_event)

        total_frames = len(frames)
        stack_frames = frames
        if bool(levels):
            start = start_frame
            end = min(start + levels, total_frames)
            stack_frames = frames[start:end]

        response = pydevd_schema.StackTraceResponse(
            request_seq=seq,
            success=True,
            command='stackTrace',
            body=pydevd_schema.StackTraceResponseBody(stackFrames=stack_frames, totalFrames=total_frames))
        return NetCommand(CMD_RETURN, 0, response, is_json=True)
Пример #3
0
def test_get_child_variables():
    from _pydevd_bundle.pydevd_suspended_frames import SuspendedFramesManager
    suspended_frames_manager = SuspendedFramesManager()
    py_db = None
    for frame in (
            get_dict_large_frame(),
            get_set_large_frame(),
            get_tuple_large_frame(),
    ):
        with suspended_frames_manager.track_frames(py_db) as tracker:
            # : :type tracker: _FramesTracker
            thread_id = 'thread1'
            tracker.track(
                thread_id,
                pydevd_frame_utils.create_frames_list_from_frame(frame))

            assert suspended_frames_manager.get_thread_id_for_variable_reference(
                id(frame)) == thread_id

            variable = suspended_frames_manager.get_variable(id(frame))

            children_variables = variable.get_child_variable_named(
                'obj').get_children_variables()
            assert len(children_variables) < _NUMBER_OF_ITEMS_TO_CREATE

            found_too_large = False
            found_len = False
            for x in children_variables:
                if x.name == TOO_LARGE_ATTR:
                    var_data = x.get_var_data()
                    assert 'readOnly' in var_data['presentationHint'][
                        'attributes']
                    found_too_large = True
                elif x.name == '__len__':
                    found_len = True

            if not found_too_large:
                raise AssertionError('Expected to find variable named: %s' %
                                     (TOO_LARGE_ATTR, ))
            if not found_len:
                raise AssertionError(
                    'Expected to find variable named: __len__')
    def make_get_thread_stack_message(self,
                                      py_db,
                                      seq,
                                      thread_id,
                                      topmost_frame,
                                      fmt,
                                      must_be_suspended=False,
                                      start_frame=0,
                                      levels=0):
        """
        Returns thread stack as XML.

        :param must_be_suspended: If True and the thread is not suspended, returns None.
        """
        try:
            # If frame is None, the return is an empty frame list.
            cmd_text = ['<xml><thread id="%s">' % (thread_id, )]

            if topmost_frame is not None:
                try:
                    # : :type suspended_frames_manager: SuspendedFramesManager
                    suspended_frames_manager = py_db.suspended_frames_manager
                    frames_list = suspended_frames_manager.get_frames_list(
                        thread_id)
                    if frames_list is None:
                        # Could not find stack of suspended frame...
                        if must_be_suspended:
                            return None
                        else:
                            frames_list = pydevd_frame_utils.create_frames_list_from_frame(
                                topmost_frame)

                    cmd_text.append(
                        self.make_thread_stack_str(py_db, frames_list))
                finally:
                    topmost_frame = None
            cmd_text.append('</thread></xml>')
            return NetCommand(CMD_GET_THREAD_STACK, seq, ''.join(cmd_text))
        except:
            return self.make_error_message(seq, get_exception_traceback_str())
    def make_get_thread_stack_message(self,
                                      py_db,
                                      seq,
                                      thread_id,
                                      topmost_frame,
                                      fmt,
                                      must_be_suspended=False,
                                      start_frame=0,
                                      levels=0):
        frames = []
        module_events = []

        try:
            # : :type suspended_frames_manager: SuspendedFramesManager
            suspended_frames_manager = py_db.suspended_frames_manager
            frames_list = suspended_frames_manager.get_frames_list(thread_id)
            if frames_list is None:
                # Could not find stack of suspended frame...
                if must_be_suspended:
                    return None
                else:
                    frames_list = pydevd_frame_utils.create_frames_list_from_frame(
                        topmost_frame)

            for frame_id, frame, method_name, original_filename, filename_in_utf8, lineno, applied_mapping, show_as_current_frame in self._iter_visible_frames_info(
                    py_db, frames_list):

                try:
                    module_name = str(frame.f_globals.get('__name__', ''))
                except:
                    module_name = '<unknown>'

                module_events.extend(
                    self.modules_manager.track_module(filename_in_utf8,
                                                      module_name, frame))

                presentation_hint = None
                if not getattr(frame, 'IS_PLUGIN_FRAME',
                               False):  # Never filter out plugin frames!
                    if py_db.is_files_filter_enabled and py_db.apply_files_filter(
                            frame, original_filename, False):
                        continue

                    if not py_db.in_project_scope(frame):
                        presentation_hint = 'subtle'

                formatted_name = self._format_frame_name(
                    fmt, method_name, module_name, lineno, filename_in_utf8)
                if show_as_current_frame:
                    formatted_name += ' (Current frame)'
                source_reference = pydevd_file_utils.get_client_filename_source_reference(
                    filename_in_utf8)

                if not source_reference and not applied_mapping and not os.path.exists(
                        original_filename):
                    if getattr(frame.f_code, 'co_lnotab', None):
                        # Create a source-reference to be used where we provide the source by decompiling the code.
                        # Note: When the time comes to retrieve the source reference in this case, we'll
                        # check the linecache first (see: get_decompiled_source_from_frame_id).
                        source_reference = pydevd_file_utils.create_source_reference_for_frame_id(
                            frame_id, original_filename)
                    else:
                        # Check if someone added a source reference to the linecache (Python attrs does this).
                        if linecache.getline(original_filename, 1):
                            source_reference = pydevd_file_utils.create_source_reference_for_linecache(
                                original_filename)

                frames.append(
                    pydevd_schema.StackFrame(
                        frame_id,
                        formatted_name,
                        lineno,
                        column=1,
                        source={
                            'path': filename_in_utf8,
                            'sourceReference': source_reference,
                        },
                        presentationHint=presentation_hint).to_dict())
        finally:
            topmost_frame = None

        for module_event in module_events:
            py_db.writer.add_command(module_event)

        total_frames = len(frames)
        stack_frames = frames
        if bool(levels):
            start = start_frame
            end = min(start + levels, total_frames)
            stack_frames = frames[start:end]

        response = pydevd_schema.StackTraceResponse(
            request_seq=seq,
            success=True,
            command='stackTrace',
            body=pydevd_schema.StackTraceResponseBody(
                stackFrames=stack_frames, totalFrames=total_frames))
        return NetCommand(CMD_RETURN, 0, response, is_json=True)
Пример #6
0
def test_suspended_frames_manager():
    from _pydevd_bundle.pydevd_suspended_frames import SuspendedFramesManager
    suspended_frames_manager = SuspendedFramesManager()
    py_db = None
    with suspended_frames_manager.track_frames(py_db) as tracker:
        # : :type tracker: _FramesTracker
        thread_id = 'thread1'
        frame = get_frame()
        tracker.track(thread_id,
                      pydevd_frame_utils.create_frames_list_from_frame(frame))

        assert suspended_frames_manager.get_thread_id_for_variable_reference(
            id(frame)) == thread_id

        variable = suspended_frames_manager.get_variable(id(frame))

        # Should be properly sorted.
        assert ['var1', 'var2', 'var3'
                ] == [x.get_name() for x in variable.get_children_variables()]

        as_dict = dict((x.get_name(), x.get_var_data())
                       for x in variable.get_children_variables())
        var_reference = as_dict['var2'].pop('variablesReference')
        assert isinstance(
            var_reference,
            int_types)  # The variable reference is always a new int.
        assert isinstance(
            as_dict['var3'].pop('variablesReference'),
            int_types)  # The variable reference is always a new int.

        check_vars_dict_expected(
            as_dict, {
                'var1': {
                    'name': 'var1',
                    'value': '1',
                    'type': 'int',
                    'evaluateName': 'var1',
                    'variablesReference': 0
                },
                'var2': {
                    'name': 'var2',
                    'value': '[1]',
                    'type': 'list',
                    'evaluateName': 'var2'
                },
                'var3': {
                    'name': 'var3',
                    'value': '{33: [1]}',
                    'type': 'dict',
                    'evaluateName': 'var3'
                }
            })

        # Now, same thing with a different format.
        as_dict = dict((x.get_name(), x.get_var_data(fmt={'hex': True}))
                       for x in variable.get_children_variables())
        var_reference = as_dict['var2'].pop('variablesReference')
        assert isinstance(
            var_reference,
            int_types)  # The variable reference is always a new int.
        assert isinstance(
            as_dict['var3'].pop('variablesReference'),
            int_types)  # The variable reference is always a new int.

        check_vars_dict_expected(
            as_dict, {
                'var1': {
                    'name': 'var1',
                    'value': '0x1',
                    'type': 'int',
                    'evaluateName': 'var1',
                    'variablesReference': 0
                },
                'var2': {
                    'name': 'var2',
                    'value': '[0x1]',
                    'type': 'list',
                    'evaluateName': 'var2'
                },
                'var3': {
                    'name': 'var3',
                    'value': '{0x21: [0x1]}',
                    'type': 'dict',
                    'evaluateName': 'var3'
                }
            })

        var2 = dict((x.get_name(), x)
                    for x in variable.get_children_variables())['var2']
        children_vars = var2.get_children_variables()
        as_dict = (dict([x.get_name(), x.get_var_data()]
                        for x in children_vars))
        assert as_dict == {
            '0': {
                'name': '0',
                'value': '1',
                'type': 'int',
                'evaluateName': 'var2[0]',
                'variablesReference': 0
            },
            '__len__': {
                'name': '__len__',
                'value': '1',
                'type': 'int',
                'evaluateName': 'len(var2)',
                'variablesReference': 0,
                'presentationHint': {
                    'attributes': ['readOnly']
                },
            },
        }

        var3 = dict((x.get_name(), x)
                    for x in variable.get_children_variables())['var3']
        children_vars = var3.get_children_variables()
        as_dict = (dict([x.get_name(), x.get_var_data()]
                        for x in children_vars))
        assert isinstance(
            as_dict['33'].pop('variablesReference'),
            int_types)  # The variable reference is always a new int.

        check_vars_dict_expected(
            as_dict, {
                '33': {
                    'name': '33',
                    'value': "[1]",
                    'type': 'list',
                    'evaluateName': 'var3[33]'
                },
                '__len__': {
                    'name': '__len__',
                    'value': '1',
                    'type': 'int',
                    'evaluateName': 'len(var3)',
                    'variablesReference': 0,
                    'presentationHint': {
                        'attributes': ['readOnly']
                    },
                }
            })
Пример #7
0
 def track(self):
     var = get_ipython().user_ns
     self.frame = _FakeFrame(_FakeCode('<module>', get_file_name('sys._getframe()')), var, var)
     self.tracker.track('thread1', pydevd_frame_utils.create_frames_list_from_frame(self.frame))