⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 phpdebugger.py

📁 Wxpython Implemented on Windows CE, Source code
💻 PY
📖 第 1 页 / 共 5 页
字号:
                frameName = frame.frameName
                if frameName == FRAME_STACK:
                    if self.isErrStack:
                        self.errStackList = self.handleRespFrameStack(self.errStackList, frame, isFirstStackFrame)
                    else:
                        self.stackList = self.handleRespFrameStack(self.stackList, frame, isFirstStackFrame)

                    if isFirstStackFrame:
                        isFirstStackFrame = False
                elif frameName == FRAME_SOURCE:
                    self.handleRespFrameSource(frame)
                elif frameName == FRAME_SRC_TREE:
                    self.handleRespFrameSrcTree(frame)
                elif frameName == FRAME_RAWDATA:
                    self.handleRespFrameRawdata(frame)
                elif frameName == FRAME_ERROR:
                    self.handleRespFrameError(frame)
                elif frameName == FRAME_EVAL:
                    self.handleRespFrameEval(frame)
                elif frameName == FRAME_BPS:
                    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)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -