📄 phpdebugger.py
字号:
self.handleRespFrameBps(frame) elif frameName == FRAME_BPL: self.handleRespFrameBpl(frame) elif frameName == FRAME_VER: self.handleRespFrameVer(frame) elif frameName == FRAME_SID: self.handleRespFrameSid(frame) elif frameName == FRAME_SRCLINESINFO: self.handleRespFrameSrclinesinfo(frame) elif frameName == FRAME_SRCCTXINFO: self.handleRespFrameSrcctxinfo(frame) elif frameName == FRAME_LOG: self.handleRespFrameLog(frame) elif frameName == FRAME_PROF: self.handleRespFrameProf(frame) elif frameName == FRAME_PROF_C: self.handleRespFrameProfC(frame) elif frameName == FRAME_SET_OPT: self.handleRespFrameSetOpt(frame) else: self.handleRespFrameUnknown(frame) return 0 # # After handling of this frame, force frame to point to the # next one based on current frame's absolute size. # frame = frame.getNextFrame(True) if cmdReceived == DBGC_REPLY: self.handleRespCmdReply() elif cmdReceived == DBGC_STARTUP: self.handleRespCmdStartup() elif cmdReceived == DBGC_END: self.handleRespCmdEnd() elif cmdReceived == DBGC_BREAKPOINT: self.handleRespCmdBreakpoint() cmdReceived = 0 elif cmdReceived == DBGC_STEPINTO_DONE: self.handleRespCmdStepintoDone() elif cmdReceived == DBGC_STEPOVER_DONE: self.handleRespCmdStepoverDone() elif cmdReceived == DBGC_STEPOUT_DONE: self.handleRespCmdStepoutDone() elif cmdReceived == DBGC_EMBEDDED_BREAK: self.handleRespCmdEmbeddedBreak() elif cmdReceived == DBGC_PAUSE: self.handleRespCmdPause() elif cmdReceived == DBGC_ERROR: self.handleRespCmdError() elif cmdReceived == DBGC_LOG: self.handleRespCmdLog() elif cmdReceived == DBGC_SID: self.handleRespCmdSid() else: self.handleRespCmdUnknown() return cmdReceived def handleRespFrameStack(self, stackList, frame, isFirst): if isFirst: stackList = [] self.stackFrameIndex = 0 lineNo = frame.getNextInt() modNo = frame.getNextInt() scopeId = frame.getNextInt() frameId = frame.getNextInt() if modNo != 0: newStackFrame = PHPStackFrame(self, self.getModByNum(modNo), lineNo, self.stackFrameIndex, scopeId, self.getRawFrameData(frameId), modNo) stackList.append(newStackFrame) self.stackFrameIndex = self.stackFrameIndex + 1 return stackList def handleRespFrameSource(self, frame): modNo = frame.getNextInt() fromFilePos = frame.getNextInt() error = frame.getNextInt() fullSize = frame.getNextInt() fileNameFrameId = frame.getNextInt() textFrameId = frame.getNextInt() fileName = self.getModByNum(modNo) if not fileName: self.setFileMod(modNo, fileNameFrameId) # # TODO: fullSize string and textFrameId are not handled here. # return def handleRespFrameSrcTree(self, frame): parentModNo = frame.getNextInt() parentLineNo = frame.getNextInt() modNo = frame.getNextInt() fileNameFrameId = frame.getNextInt() fileName = self.getModByNum(modNo) if not fileName: self.setFileMod(modNo, fileNameFrameId) return def handleRespFrameRawdata(self, frame): frameNo = frame.getNextInt() if frameNo > 0: toRead = frame.getNextInt() if toRead > 0: str = frame.getNextString(toRead) self.rawDataDict[frameNo] = str myprint("handleRespFrameRawdata(): added \'%d\'=\'%s\' to rawDataDict.", (frameNo, str)) return def handleRespFrameError(self, frame): self.isErrStack = True # # Type of the error. # errInt0 = frame.getNextInt() # # ID of error message. # errInt1 = frame.getNextInt() if errInt0 == E_ERROR: errIdStr = "[Error]" elif errInt0 == E_WARNING: errIdStr = "[Warning]" elif errInt0 == E_PARSE: errIdStr = "[Parse Error]" elif errInt0 == E_NOTICE: errIdStr = "[Notice]" elif errInt0 == E_CORE_ERROR: errIdStr = "[Core Error]" elif errInt0 == E_CORE_WARNING: errIdStr = "[Core Warning]" elif errInt0 == E_COMPILE_ERROR: errIdStr = "[Compile Error]" elif errInt0 == E_COMPILE_WARNING: errIdStr = "[Compile Warning]" elif errInt0 == E_USER_ERROR: errIdStr = "[User Error]" elif errInt0 == E_USER_WARNING: errIdStr = "[User Warning]" elif errInt0 == E_USER_NOTICE: errIdStr = "[User Notice]" else: errIdStr = "[Unexpected Error]" errMsg = self.getRawFrameData(errInt1) if errMsg and len(errMsg) > 0: self.errStr = errIdStr + ": " + errMsg + "\n" else: self.errStr = errIdStr + ": <Invalid Error Message>\n" if not self.stopOnError: if self.lastCommand == DBGA_CONTINUE: self.Continue() elif self.lastCommand == DBGA_STEPINTO: self.SingleStep() elif self.lastCommand == DBGA_STEPOUT: self.Return() elif self.lastCommand == DBGA_STEPOVER: self.Next() return def handleRespFrameEval(self, frame): evalInt0 = frame.getNextInt() evalInt1 = frame.getNextInt() evalInt2 = frame.getNextInt() self.evalRet = self.getRawFrameData(evalInt1) #TODO: is the following necessary? evalStr = self.getRawFrameData(evalInt0) return def handleRespFrameBps(self, frame): return def handleRespFrameBpl(self, frame): # # Get this breakpoint. # dbgBp = [] for i in range(10): dbgBp.append(frame.getNextInt()) if dbgBp[2] != 0: # # If filename is sent, get it from the rawDataDict. # fileName = self.getRawFrameData(dbgBp[2]) if not fileName: return # # If this filename comes with a mod number, store this # modNum/fileName into this session's modDict. Notice it might # overwrite previous value. # if dbgBp[0] != 0: self.setMod(dbgBp[0], fileName) elif dbgBp[0] != 0: # # Use modNum to get the fileName. # fileName = self.getModByNum(dbgBp[0]) if not fileName: return else: # # Couldn't get the filename; nothing we can do with. # return bpKey = self.createBpKey(fileName, dbgBp[1]) if not self.bpDict.has_key(bpKey): # # Not in our bp list? Anyway, create one for it. # ourBp = BreakPoint(self, fileName, dbgBp[1], dbgBp[0], dbgBp[3], dbgBp[4], dbgBp[5], dbgBp[6], dbgBp[7], dbgBp[8], dbgBp[9]) self.bpDict[bpKey] = ourBp newlyCreated = True else: ourBp = self.bpDict[bpKey] newlyCreated = False # # Update with the latest bp information. # if not newlyCreated: ourBp.update(dbgBp) return def handleRespFrameVer(self, frame): self.verMajor = frame.getNextInt() self.verMinor = frame.getNextInt() verFrameNo = frame.getNextInt() self.verDesc = self.getRawFrameData(verFrameNo) myprint("respFrameVer: verMajor=%s, verMinor=%s, verDesc=%s", (repr(self.verMajor), repr(self.verMinor), repr(self.verDesc))) return def handleRespFrameSid(self, frame): self.sessID = frame.getNextInt() self.sessType = frame.getNextInt() myprint("respFrameSid: sessID=%s, sessType=%s", (self.sessID, self.sessType)) return def handleRespFrameSrclinesinfo(self, frame): return def handleRespFrameSrcctxinfo(self, frame): return def handleRespFrameLog(self, frame): # # TODO: # Now we don't do much here besides following the protocol to retrieve # the data. # logId = frame.getNextInt() logType = frame.getNextInt() modNo = frame.getNextInt() lineNo = frame.getNextInt() fileNameFrameId = frame.getNextInt() extInfo = frame.getNextInt() fileName = self.getModByNum(modNo) if not fileName: self.setFileMod(modNo, fileNameFrameId) return def handleRespFrameProf(self, frame): return def handleRespFrameProfC(self, frame): return def handleRespFrameSetOpt(self, frame): return def handleRespCmdReply(self): return def handleRespCmdStartup(self): return def handleRespCmdEnd(self): self.sessEnded = True return def handleRespCmdBreakpoint(self): return def handleRespCmdStepintoDone(self): return def handleRespCmdStepoverDone(self): return def handleRespCmdStepoutDone(self): return def handleRespCmdEmbeddedBreak(self): return def handleRespCmdPause(self): return def handleRespCmdError(self): self.stackList = [] if len(self.errStackList) > 0: self.errStr = self.errStr + "Stack Trace:\n" while len(self.errStackList) > 0: oneStack = self.errStackList.pop() self.errStr = self.errStr + "%s\n" % oneStack.getLongDisplayStr() self.ui.showErrorDialog(self.errStr, "PHP Error") myprint("Got PHP Error:\n%s", self.errStr) return def handleRespCmdLog(self): return def handleRespCmdSid(self): return def setFileMod(self, modNo, fileNameFrameId): if fileNameFrameId != 0: fileName = self.getRawFrameData(fileNameFrameId) if fileName and modNo != 0: self.setMod(modNo, fileName) return def createBpKey(self, fileName, lineNo): # # This is to work around a bug in dbg module where it changes the path # names that we pass to it to lower cases. # if sysutils.isWindows(): fileName = fileName.lower() return (fileName, lineNo) def setLsnrAction(self, actioni): self.lsnrAction = actioni return def getLsnrAction(self): return self.lsnrAction def currConnFinished(self): self.clearInternals() self.setLsnrAction(PHPDebuggerCallback.ACTION_LISTEN) self.actionEvent.set() self.ui.DisableAfterStop() def stopPhpDbg(self): # # TODO: should send a request to stop the current running PHP program. # should handle network blocking issue correctly, otherwise, we # might hang here. # reqPacket = PHPDBGPacket(DBGA_STOP) try: reqPacket.sendPacket(self.lsnrThr) self.awaitAndHandleResponse(stopping = True) except PHPDBGConnException: pass self.currConnFinished() return
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -