def make_thread_stack_str(self, frame, frame_id_to_lineno=None): ''' :param frame_id_to_lineno: If available, the line number for the frame will be gotten from this dict, otherwise frame.f_lineno will be used (needed for unhandled exceptions as the place where we report may be different from the place where it's raised). ''' if frame_id_to_lineno is None: frame_id_to_lineno = {} make_valid_xml_value = pydevd_xml.make_valid_xml_value cmd_text_list = [] append = cmd_text_list.append curr_frame = frame frame = None # Clear frame reference try: py_db = get_global_debugger() for frame_id, frame, method_name, filename_in_utf8, lineno in self._iter_visible_frames_info( py_db, curr_frame, frame_id_to_lineno ): # print("file is ", filename_in_utf8) # print("line is ", lineno) # Note: variables are all gotten 'on-demand'. append('<frame id="%s" name="%s" ' % (frame_id , make_valid_xml_value(method_name))) append('file="%s" line="%s">' % (quote(make_valid_xml_value(filename_in_utf8), '/>_= \t'), lineno)) append("</frame>") except: traceback.print_exc() curr_frame = None # Clear frame reference return ''.join(cmd_text_list)
def make_thread_stack_str(self, frame, frame_id_to_lineno=None): ''' :param frame_id_to_lineno: If available, the line number for the frame will be gotten from this dict, otherwise frame.f_lineno will be used (needed for unhandled exceptions as the place where we report may be different from the place where it's raised). ''' if frame_id_to_lineno is None: frame_id_to_lineno = {} make_valid_xml_value = pydevd_xml.make_valid_xml_value cmd_text_list = [] append = cmd_text_list.append curr_frame = frame frame = None # Clear frame reference try: py_db = get_global_debugger() for frame_id, frame, method_name, _original_filename, filename_in_utf8, lineno in self._iter_visible_frames_info( py_db, curr_frame, frame_id_to_lineno): # print("file is ", filename_in_utf8) # print("line is ", lineno) # Note: variables are all gotten 'on-demand'. append('<frame id="%s" name="%s" ' % (frame_id, make_valid_xml_value(method_name))) append('file="%s" line="%s">' % (quote(make_valid_xml_value(filename_in_utf8), '/>_= \t'), lineno)) append("</frame>") except: traceback.print_exc() curr_frame = None # Clear frame reference return ''.join(cmd_text_list)
def __init__(self, cmd_id, seq, text, is_json=False): """ If sequence is 0, new sequence will be generated (otherwise, this was the response to a command from the client). """ protocol = get_protocol() self.id = cmd_id if seq == 0: NetCommand.next_seq += 2 seq = NetCommand.next_seq self.seq = seq if is_json: if hasattr(text, 'to_dict'): as_dict = text.to_dict(update_ids_to_dap=True) else: assert isinstance(text, dict) as_dict = text as_dict['pydevd_cmd_id'] = cmd_id as_dict['seq'] = seq self.as_dict = as_dict text = json.dumps(as_dict) if IS_PY2: if isinstance(text, unicode): text = text.encode('utf-8') else: assert isinstance(text, str) else: assert isinstance(text, str) if DebugInfoHolder.DEBUG_TRACE_LEVEL >= 1: self._show_debug_info(cmd_id, seq, text) if is_json: msg = text else: if protocol not in (HTTP_PROTOCOL, HTTP_JSON_PROTOCOL): encoded = quote(to_string(text), '/<>_=" \t') msg = '%s\t%s\t%s\n' % (cmd_id, seq, encoded) else: msg = '%s\t%s\t%s' % (cmd_id, seq, text) if IS_PY2: assert isinstance(msg, str) # i.e.: bytes as_bytes = msg else: if isinstance(msg, str): msg = msg.encode('utf-8') assert isinstance(msg, bytes) as_bytes = msg self._as_bytes = as_bytes
def make_thread_stack_str(self, frame, frame_id_to_lineno=None): ''' :param frame_id_to_lineno: If available, the line number for the frame will be gotten from this dict, otherwise frame.f_lineno will be used (needed for unhandled exceptions as the place where we report may be different from the place where it's raised). ''' if frame_id_to_lineno is None: frame_id_to_lineno = {} make_valid_xml_value = pydevd_xml.make_valid_xml_value cmd_text_list = [] append = cmd_text_list.append curr_frame = frame frame = None # Clear frame reference try: py_db = get_global_debugger() while curr_frame: frame_id = id(curr_frame) if curr_frame.f_code is None: break # Iron Python sometimes does not have it! method_name = curr_frame.f_code.co_name # method name (if in method) or ? if global if method_name is None: break # Iron Python sometimes does not have it! abs_path_real_path_and_base = get_abs_path_real_path_and_base_from_frame(curr_frame) if py_db.get_file_type(abs_path_real_path_and_base) == py_db.PYDEV_FILE: # Skip pydevd files. curr_frame = curr_frame.f_back continue filename_in_utf8 = pydevd_file_utils.norm_file_to_client(abs_path_real_path_and_base[0]) if not filesystem_encoding_is_utf8 and hasattr(filename_in_utf8, "decode"): # filename_in_utf8 is a byte string encoded using the file system encoding # convert it to utf8 filename_in_utf8 = filename_in_utf8.decode(file_system_encoding).encode("utf-8") # print("file is ", filename_in_utf8) lineno = frame_id_to_lineno.get(frame_id, curr_frame.f_lineno) # print("line is ", lineno) # Note: variables are all gotten 'on-demand'. append('<frame id="%s" name="%s" ' % (frame_id , make_valid_xml_value(method_name))) append('file="%s" line="%s">' % (quote(make_valid_xml_value(filename_in_utf8), '/>_= \t'), lineno)) append("</frame>") curr_frame = curr_frame.f_back except: traceback.print_exc() curr_frame = None # Clear frame reference return ''.join(cmd_text_list)
def make_thread_stack_str(self, frame, frame_to_lineno=None): ''' :param frame_to_lineno: If available, the line number for the frame will be gotten from this dict, otherwise frame.f_lineno will be used (needed for unhandled exceptions as the place where we report may be different from the place where it's raised). ''' if frame_to_lineno is None: frame_to_lineno = {} make_valid_xml_value = pydevd_xml.make_valid_xml_value cmd_text_list = [] append = cmd_text_list.append curr_frame = frame frame = None # Clear frame reference try: py_db = get_global_debugger() while curr_frame: my_id = id(curr_frame) if curr_frame.f_code is None: break # Iron Python sometimes does not have it! method_name = curr_frame.f_code.co_name # method name (if in method) or ? if global if method_name is None: break # Iron Python sometimes does not have it! abs_path_real_path_and_base = get_abs_path_real_path_and_base_from_frame(curr_frame) if py_db.get_file_type(abs_path_real_path_and_base) == py_db.PYDEV_FILE: # Skip pydevd files. curr_frame = curr_frame.f_back continue filename_in_utf8 = pydevd_file_utils.norm_file_to_client(abs_path_real_path_and_base[0]) if not filesystem_encoding_is_utf8 and hasattr(filename_in_utf8, "decode"): # filename_in_utf8 is a byte string encoded using the file system encoding # convert it to utf8 filename_in_utf8 = filename_in_utf8.decode(file_system_encoding).encode("utf-8") # print("file is ", filename_in_utf8) lineno = frame_to_lineno.get(curr_frame, curr_frame.f_lineno) # print("line is ", lineno) # Note: variables are all gotten 'on-demand'. append('<frame id="%s" name="%s" ' % (my_id , make_valid_xml_value(method_name))) append('file="%s" line="%s">' % (quote(make_valid_xml_value(filename_in_utf8), '/>_= \t'), lineno)) append("</frame>") curr_frame = curr_frame.f_back except: traceback.print_exc() curr_frame = None # Clear frame reference return ''.join(cmd_text_list)
def __init__(self, cmd_id, seq, text, is_json=False): """ If sequence is 0, new sequence will be generated (otherwise, this was the response to a command from the client). """ protocol = get_protocol() self.id = cmd_id if seq == 0: NetCommand.next_seq += 2 seq = NetCommand.next_seq self.seq = seq if is_json: if hasattr(text, 'to_dict'): as_dict = text.to_dict(update_ids_to_dap=True) else: assert isinstance(text, dict) as_dict = text as_dict['pydevd_cmd_id'] = cmd_id as_dict['seq'] = seq text = json.dumps(as_dict) if IS_PY2: if isinstance(text, unicode): text = text.encode('utf-8') else: assert isinstance(text, str) else: assert isinstance(text, str) if DebugInfoHolder.DEBUG_TRACE_LEVEL >= 1: self._show_debug_info(cmd_id, seq, text) if is_json: msg = text else: if protocol not in (HTTP_PROTOCOL, HTTP_JSON_PROTOCOL): encoded = quote(to_string(text), '/<>_=" \t') msg = '%s\t%s\t%s\n' % (cmd_id, seq, encoded) else: msg = '%s\t%s\t%s' % (cmd_id, seq, text) if IS_PY2: assert isinstance(msg, str) # i.e.: bytes as_bytes = msg else: if isinstance(msg, str): msg = msg.encode('utf-8') assert isinstance(msg, bytes) as_bytes = msg self._as_bytes = as_bytes
def internal_get_description(dbg, seq, thread_id, frame_id, expression): ''' Fetch the variable description stub from the debug console ''' try: frame = dbg.find_frame(thread_id, frame_id) description = pydevd_console.get_description(frame, thread_id, frame_id, expression) description = pydevd_xml.make_valid_xml_value(quote(description, '/>_= \t')) description_xml = '<xml><var name="" type="" value="%s"/></xml>' % description cmd = dbg.cmd_factory.make_get_description_message(seq, description_xml) dbg.writer.add_command(cmd) except: exc = get_exception_traceback_str() cmd = dbg.cmd_factory.make_error_message(seq, "Error in fetching description" + exc) dbg.writer.add_command(cmd)
def make_io_message(self, v, ctx): ''' @param v: the message to pass to the debug server @param ctx: 1 for stdio 2 for stderr ''' try: if len(v) > MAX_IO_MSG_SIZE: v = v[0:MAX_IO_MSG_SIZE] v += '...' v = pydevd_xml.make_valid_xml_value(quote(v, '/>_= ')) return NetCommand(str(CMD_WRITE_TO_CONSOLE), 0, '<xml><io s="%s" ctx="%s"/></xml>' % (v, ctx)) except: return self.make_error_message(0, get_exception_traceback_str())
def make_io_message(self, v, ctx): ''' @param v: the message to pass to the debug server @param ctx: 1 for stdio 2 for stderr ''' try: if len(v) > MAX_IO_MSG_SIZE: v = v[0:MAX_IO_MSG_SIZE] v += '...' v = pydevd_xml.make_valid_xml_value(quote(v, '/>_= ')) return NetCommand(str(CMD_WRITE_TO_CONSOLE), 0, '<xml><io s="%s" ctx="%s"/></xml>' % (v, ctx)) except: return self.make_error_message(0, get_exception_traceback_str())
def make_io_message(self, msg, ctx): ''' @param msg: the message to pass to the debug server @param ctx: 1 for stdio 2 for stderr ''' try: msg = pydevd_constants.as_str(msg) if len(msg) > MAX_IO_MSG_SIZE: msg = msg[0:MAX_IO_MSG_SIZE] msg += '...' msg = pydevd_xml.make_valid_xml_value(quote(msg, '/>_= ')) return NetCommand(str(CMD_WRITE_TO_CONSOLE), 0, '<xml><io s="%s" ctx="%s"/></xml>' % (msg, ctx)) except: return self.make_error_message(0, get_exception_traceback_str())
def make_list_threads_message(self, py_db, seq): """ returns thread listing as XML """ try: threads = get_non_pydevd_threads() cmd_text = ["<xml>"] append = cmd_text.append for thread in threads: if is_thread_alive(thread): append(self._thread_to_xml(thread)) for thread_id, thread_name in list( self._additional_thread_id_to_thread_name.items()): name = pydevd_xml.make_valid_xml_value(thread_name) append('<thread name="%s" id="%s" />' % (quote(name), thread_id)) append("</xml>") return NetCommand(CMD_RETURN, seq, ''.join(cmd_text)) except: return self.make_error_message(seq, get_exception_traceback_str())
def make_thread_stack_str(self, py_db, frames_list): assert frames_list.__class__ == FramesList make_valid_xml_value = pydevd_xml.make_valid_xml_value cmd_text_list = [] append = cmd_text_list.append try: for frame_id, frame, method_name, _original_filename, filename_in_utf8, lineno, _applied_mapping in self._iter_visible_frames_info( py_db, frames_list ): # print("file is ", filename_in_utf8) # print("line is ", lineno) # Note: variables are all gotten 'on-demand'. append('<frame id="%s" name="%s" ' % (frame_id , make_valid_xml_value(method_name))) append('file="%s" line="%s">' % (quote(make_valid_xml_value(filename_in_utf8), '/>_= \t'), lineno)) append("</frame>") except: pydev_log.exception() return ''.join(cmd_text_list)
def _thread_to_xml(self, thread): """ thread information as XML """ name = pydevd_xml.make_valid_xml_value(thread.getName()) cmdText = '<thread name="%s" id="%s" />' % (quote(name), get_thread_id(thread)) return cmdText
def _thread_to_xml(self, thread): """ thread information as XML """ name = pydevd_xml.make_valid_xml_value(thread.getName()) cmdText = '<thread name="%s" id="%s" />' % (quote(name), get_thread_id(thread)) return cmdText