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)
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)
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'] }, } })
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))