def findFrame(thread_id, frame_id): """ returns a frame on the thread that has a given frame_id """ if thread_id != GetThreadId(threading.currentThread()): raise VariableError("findFrame: must execute on same thread") lookingFor = int(frame_id) if AdditionalFramesContainer.additional_frames: if DictContains(AdditionalFramesContainer.additional_frames, thread_id): frame = AdditionalFramesContainer.additional_frames[thread_id].get(lookingFor) if frame is not None: return frame curFrame = GetFrame() if frame_id == "*": return curFrame # any frame is specified with "*" frameFound = None for frame in iterFrames(curFrame): if lookingFor == id(frame): frameFound = frame del frame break del frame #Important: python can hold a reference to the frame from the current context #if an exception is raised, so, if we don't explicitly add those deletes #we might have those variables living much more than we'd want to. #I.e.: sys.exc_info holding reference to frame that raises exception (so, other places #need to call sys.exc_clear()) del curFrame if frameFound is None: msgFrames = '' i = 0 for frame in iterFrames(GetFrame()): i += 1 msgFrames += str(id(frame)) if i % 5 == 0: msgFrames += '\n' else: msgFrames += ' - ' errMsg = '''findFrame: frame not found. Looking for thread_id:%s, frame_id:%s Current thread_id:%s, available frames: %s ''' % (thread_id, lookingFor, GetThreadId(threading.currentThread()), msgFrames) sys.stderr.write(errMsg) return None return frameFound
def do_connect_to_debugger(): try: # Try to import the packages needed to attach the debugger import pydevd import _pydev_threading as threading except: # This happens on Jython embedded in host eclipse traceback.print_exc() sys.stderr.write('pydevd is not available, cannot connect\n',) import pydev_localhost threading.currentThread().__pydevd_id__ = "console_main" self.orig_findFrame = pydevd_vars.findFrame pydevd_vars.findFrame = self._findFrame self.debugger = pydevd.PyDB() try: self.debugger.connect(pydev_localhost.get_localhost(), debuggerPort) self.debugger.prepareToRun() import pydevd_tracing pydevd_tracing.SetTrace(None) except: traceback.print_exc() sys.stderr.write('Failed to connect to target debugger.\n') # Register to process commands when idle self.debugrunning = False try: import pydevconsole pydevconsole.set_debug_hook(self.debugger.processInternalCommands) except: traceback.print_exc() sys.stderr.write('Version of Python does not support debuggable Interactive Console.\n')
def get_interpreter(): try: interpreterInterface = getattr(__builtin__, 'interpreter') except AttributeError: interpreterInterface = InterpreterInterface(None, None, threading.currentThread()) setattr(__builtin__, 'interpreter', interpreterInterface) return interpreterInterface
def dumpFrames(thread_id): sys.stdout.write('dumping frames\n') if thread_id != GetThreadId(threading.currentThread()): raise VariableError("findFrame: must execute on same thread") curFrame = GetFrame() for frame in iterFrames(curFrame): sys.stdout.write('%s\n' % pickle.dumps(frame))
def StartServer(host, port, client_port): #replace exit (see comments on method) #note that this does not work in jython!!! (sys method can't be replaced). sys.exit = DoExit interpreter = InterpreterInterface(host, client_port, threading.currentThread()) start_new_thread(start_server,(host, port, interpreter)) process_exec_queue(interpreter)
def StartServer(host, port, client_port): # replace exit (see comments on method) # note that this does not work in jython!!! (sys method can't be replaced). sys.exit = _DoExit interpreter = InterpreterInterface(host, client_port, threading.currentThread()) server_thread = threading.Thread(target=start_server, name="ServerThread", args=(host, port, interpreter)) server_thread.setDaemon(True) server_thread.start() process_exec_queue(interpreter)
def get_interpreter(): try: interpreterInterface = getattr(__builtin__, 'interpreter') except AttributeError: # fake return_controll_callback function just to prevent exception in PyCharm bebug console from pydev_ipython.inputhook import set_return_control_callback set_return_control_callback(lambda x: True) interpreterInterface = InterpreterInterface(None, None, threading.currentThread()) setattr(__builtin__, 'interpreter', interpreterInterface) return interpreterInterface
def StartServer(host, port, client_port): #replace exit (see comments on method) #note that this does not work in jython!!! (sys method can't be replaced). sys.exit = _DoExit interpreter = InterpreterInterface(host, client_port, threading.currentThread()) server_thread = threading.Thread(target=start_server, name='ServerThread', args=(host, port, interpreter)) server_thread.setDaemon(True) server_thread.start() process_exec_queue(interpreter)
def inner(*args, **kwargs): print("start_new_thread called with params", args, kwargs) thread = threading.currentThread() thread.additionalInfo.save = True return fun(*args, **kwargs)
def getVariable(thread_id, frame_id, scope, attrs): """ returns the value of a variable :scope: can be BY_ID, EXPRESSION, GLOBAL, LOCAL, FRAME BY_ID means we'll traverse the list of all objects alive to get the object. :attrs: after reaching the proper scope, we have to get the attributes until we find the proper location (i.e.: obj\tattr1\tattr2) :note: when BY_ID is used, the frame_id is considered the id of the object to find and not the frame (as we don't care about the frame in this case). """ if scope == 'BY_ID': if thread_id != GetThreadId(threading.currentThread()) : raise VariableError("getVariable: must execute on same thread") try: import gc objects = gc.get_objects() except: pass #Not all python variants have it. else: frame_id = int(frame_id) for var in objects: if id(var) == frame_id: if attrs is not None: attrList = attrs.split('\t') for k in attrList: _type, _typeName, resolver = getType(var) var = resolver.resolve(var, k) return var #If it didn't return previously, we coudn't find it by id (i.e.: alrceady garbage collected). sys.stderr.write('Unable to find object with id: %s\n' % (frame_id,)) return None frame = findFrame(thread_id, frame_id) if frame is None: return {} if attrs is not None: attrList = attrs.split('\t') else: attrList = [] if scope == 'EXPRESSION': for count in xrange(len(attrList)): if count == 0: # An Expression can be in any scope (globals/locals), therefore it needs to evaluated as an expression var = evaluateExpression(thread_id, frame_id, attrList[count], False) else: _type, _typeName, resolver = getType(var) var = resolver.resolve(var, attrList[count]) else: if scope == "GLOBAL": var = frame.f_globals del attrList[0] # globals are special, and they get a single dummy unused attribute else: var = frame.f_locals for k in attrList: _type, _typeName, resolver = getType(var) var = resolver.resolve(var, k) return var
def getVariable(thread_id, frame_id, scope, attrs): """ returns the value of a variable :scope: can be BY_ID, EXPRESSION, GLOBAL, LOCAL, FRAME BY_ID means we'll traverse the list of all objects alive to get the object. :attrs: after reaching the proper scope, we have to get the attributes until we find the proper location (i.e.: obj\tattr1\tattr2) :note: when BY_ID is used, the frame_id is considered the id of the object to find and not the frame (as we don't care about the frame in this case). """ if scope == 'BY_ID': if thread_id != GetThreadId(threading.currentThread()): raise VariableError("getVariable: must execute on same thread") try: import gc objects = gc.get_objects() except: pass #Not all python variants have it. else: frame_id = int(frame_id) for var in objects: if id(var) == frame_id: if attrs is not None: attrList = attrs.split('\t') for k in attrList: _type, _typeName, resolver = getType(var) var = resolver.resolve(var, k) return var #If it didn't return previously, we coudn't find it by id (i.e.: alrceady garbage collected). sys.stderr.write('Unable to find object with id: %s\n' % (frame_id, )) return None frame = findFrame(thread_id, frame_id) if frame is None: return {} if attrs is not None: attrList = attrs.split('\t') else: attrList = [] if scope == 'EXPRESSION': for count in xrange(len(attrList)): if count == 0: # An Expression can be in any scope (globals/locals), therefore it needs to evaluated as an expression var = evaluateExpression(thread_id, frame_id, attrList[count], False) else: _type, _typeName, resolver = getType(var) var = resolver.resolve(var, attrList[count]) else: if scope == "GLOBAL": var = frame.f_globals del attrList[ 0] # globals are special, and they get a single dummy unused attribute else: # in a frame access both locals and globals as Python does var = {} var.update(frame.f_globals) var.update(frame.f_locals) for k in attrList: _type, _typeName, resolver = getType(var) var = resolver.resolve(var, k) return var
def findFrame(thread_id, frame_id): """ returns a frame on the thread that has a given frame_id """ try: curr_thread_id = GetThreadId(threading.currentThread()) if thread_id != curr_thread_id: try: return getCustomFrame(thread_id, frame_id) # I.e.: thread_id could be a stackless frame id + thread_id. except: pass raise VariableError("findFrame: must execute on same thread (%s != %s)" % (thread_id, curr_thread_id)) lookingFor = int(frame_id) if AdditionalFramesContainer.additional_frames: if DictContains(AdditionalFramesContainer.additional_frames, thread_id): frame = AdditionalFramesContainer.additional_frames[thread_id].get(lookingFor) if frame is not None: return frame curFrame = GetFrame() if frame_id == "*": return curFrame # any frame is specified with "*" frameFound = None for frame in iterFrames(curFrame): if lookingFor == id(frame): frameFound = frame del frame break del frame # Important: python can hold a reference to the frame from the current context # if an exception is raised, so, if we don't explicitly add those deletes # we might have those variables living much more than we'd want to. # I.e.: sys.exc_info holding reference to frame that raises exception (so, other places # need to call sys.exc_clear()) del curFrame if frameFound is None: msgFrames = "" i = 0 for frame in iterFrames(GetFrame()): i += 1 msgFrames += str(id(frame)) if i % 5 == 0: msgFrames += "\n" else: msgFrames += " - " errMsg = """findFrame: frame not found. Looking for thread_id:%s, frame_id:%s Current thread_id:%s, available frames: %s\n """ % ( thread_id, lookingFor, curr_thread_id, msgFrames, ) sys.stderr.write(errMsg) return None return frameFound except: import traceback traceback.print_exc() return None