📄 phpdebugger.py
字号:
if len(tmp) == 2: self.shortDesc = tmp[1] elif len(tmp) == 1: self.shortDesc = tmp[0] else: self.shortDesc = None return # # The fileName is None, we will try our best efforts to get it. # if len(tmp) == 2: # # We retrieved long finename from the description. If we haven't # stored the file mod before, set this one as the new one. # Otherwise, we prefer to keep the stored one. # if self.modNum != 0: storedFileName = self.interface.getModByNum(self.modNum) if not storedFileName: self.interface.setMod(self.modNum, tmp[0]) self.fileName = tmp[0] self.shortFileName = os.path.basename(tmp[0]) self.shortDesc = tmp[1] elif len(tmp) == 1: self.fileName = None self.shortFileName = None self.shortDesc = tmp[0] else: self.shortFileName = None self.shortDesc = None myprint("PHPStackFrame::_getFileNamesAndShortDesc(): something wrong with desc: %s?", self.desc) return def getShortFileName(self): return self.shortFileName def setShortFileName(self, shortFileName): self.shortFileName = shortFileName def getShortDesc(self): return self.shortDesc def getLineNo(self): return self.lineNo def getInterface(self): return self.interface def getVariables(self): if len(self.variables) == 0: self.variables = self.interface.getVariables(self) return self.variables def findVariables(self, s): if self.hasVariables(): name = "$" + s for var in self.variables: if var.getName() == name: return var return None def hasVariables(self): if len(self.variables) == 0: return False else: return True def getName(self): if self.getDesc(): return self.getDesc() + " [line: " + str(self.getLineNo()) + "]" else: return self.getFileName() + " [line: " + str(self.getLineNo()) + "]" def getFileName(self): return self.fileName def setFileName(self, fileName): self.fileName = fileName def setDesc(self, desc): self.desc = desc def getDesc(self): return self.desc def getFrameScopeId(self): return self.scopeId def getFrameIndex(self): return self.frameIndex def getDisplayStr(self, stackList = None): if self.displayStr: return self.displayStr if not self.shortFileName: if stackList: i = stackList.index(self) for j in range(i + 1, len(stackList)): self.shortFileName = stackList[j].getShortFileName() if self.shortFileName: self.fileName = stackList[j].getFileName() if self.shortFileName: if self.shortDesc: self.displayStr = "<%s> at %s:%d" % (self.shortDesc, self.shortFileName, self.lineNo) else: self.displayStr = "%s:%d" % (self.shortFileName, self.lineNo) else: if self.shortDesc: self.displayStr = "<%s>" % self.shortDesc else: self.displayStr = "<internal stack error>" return self.displayStr def getLongDisplayStr(self): if self.longDisplayStr: return self.longDisplayStr if self.fileName: if self.shortDesc: self.longDisplayStr = "<%s> at %s:%d" % (self.shortDesc, self.fileName, self.lineNo) else: self.longDisplayStr = "%s:%d" % (self.fileName, self.lineNo) else: if self.shortDesc: self.longDisplayStr = "<%s>" % self.shortDesc else: self.longDisplayStr = "<internal stack error>" return self.longDisplayStrclass BreakPoint(object): def __init__(self, interface, fileName, lineNo, modNum = 0, state = BPS_ENABLED + BPS_UNRESOLVED, isTemp = 0, hitCount = 0, skipHits = 0, condition = 0, bpId = 0, isUnderHit = 0): self.interface = interface self.fileName = fileName self.lineNo = lineNo self.bpID = bpId self.state = state self.isTemp = isTemp self.hitCount = hitCount self.skipHits = skipHits self.condition = condition self.isUnderHit = 0 if modNum == 0: self.modNum = self.interface.getModByFileName(fileName) else: self.modNum = modNum if self.modNum: self.fCounterOrZero = 0 else: self.fCounterOrZero = interface.getNextFrameCounter() def sendSelf(self): reqPacket = PHPDBGPacket(DBGA_REQUEST) reqFrame1 = PHPDBGFrame(FRAME_BPS) if self.modNum: reqFrame1.addInt(self.modNum) else: # # 0 in modNum to tell to use fileName instead. # reqFrame1.addInt(0) reqFrame1.addInt(self.lineNo) # lineNo reqFrame1.addInt(self.fCounterOrZero) # fileName frameCounter or 0 reqFrame1.addInt(self.state) # state reqFrame1.addInt(self.isTemp) # isTemp reqFrame1.addInt(self.hitCount) # hitCount reqFrame1.addInt(self.skipHits) # skipHits reqFrame1.addInt(self.condition) # condition reqFrame1.addInt(self.bpID) # breakpoint sequence id reqFrame1.addInt(self.isUnderHit) # isUnderHit if not self.modNum: reqFrame2 = PHPDBGFrame(FRAME_RAWDATA) reqFrame2.addInt(self.fCounterOrZero) reqFrame2.addInt(len(self.fileName) + 1) reqFrame2.addStr(self.fileName) reqPacket.addFrame(reqFrame2) reqPacket.addFrame(reqFrame1) try: reqPacket.sendPacket(self.interface.lsnrThr) self.interface.awaitAndHandleResponse() except PHPDBGConnException: self.interface.currConnFinished() return def addSelf(self): self.sendSelf() def removeSelf(self): self.state = BPS_DISABLED self.sendSelf() def isUnderHit(self): return self.isUnderHit == 1 def update(self, dbgBp): self.modNum = dbgBp[0] self.state = dbgBp[3] self.isTemp = dbgBp[4] self.hitCount = dbgBp[5] self.skipHits = dbgBp[6] self.condition = dbgBp[7] self.bpID = dbgBp[8] self.isUnderHit = dbgBp[9]class PHPDBGEvalString(object): def __init__(self, stackFrame, dataStr): self.stackFrame = stackFrame self.dataStr = dataStr # # Get a list of variables under self.stackFrame. # def getVars(self): return self.parseAVariable(isRealVar = False) # # if isRealVar: # returnList[0] = The Variable # else: # returnList = list of variables. # def parseAVariable(self, isRealVar = True): returnList = [] # # Get the variable name first. Notice we ignore this entity's data # type here. # if isRealVar: nameEntity = self.parseAnEntity() if not nameEntity or len(nameEntity) != 2 or type(nameEntity[1]) != str: myprint("PHPDBGEvalStr::parseAVariable() got a wrong name entity") return returnList else: varName = nameEntity[1] # # Get the variable's value. # valueEntity = self.parseAnEntity() if not valueEntity or len(valueEntity) < 1: myprint("PHPDBGEvalStr::parseAVariable(): couldn't get a variable's value entity.") return returnList # # This variable's data type. # varType = valueEntity[0] if isRealVar: # # If this is a real variable, return a list which contains only # this variable item. # #valueEntity = valueEntity[1:] variable = PHPVariable(self.stackFrame, None, varType, varName, valueEntity[1:]) #myprint("xxxxCreated variable varName=%s, valueEntity=%s", (repr(varName), repr(valueEntity[1]))) myprint("xxxxCreated variable: %s", repr(variable.toString())) returnList.append(variable) else: # # If this is a root variable container, returns a list of # variables under the root. Do a sanity check here. # if valueEntity[0] != PHPValue.PEVT_ARRAY: myprint("PHPDBGEvalStr::parseAVariable(): failed to parse the root variable container.") else: returnList = valueEntity[1:] return returnList # # An entity could be a variable's name or its value. # # returnList[0] = variable data type # returnList[1:] = the real list # def parseAnEntity(self): if not self.dataStr or len(self.dataStr) < 2 or (self.dataStr[1] != ':' and self.dataStr[1] != ';'): myprint("PHPDBGEvalStr::parseAnEntity(): failed to parse %s.", repr(self.dataStr)) return None returnList = [] typeChar = self.dataStr[0] self.dataStr = self.dataStr[2:] if typeChar == 'i': returnList.append(PHPValue.PEVT_LONG) self.parseInt(returnList) elif typeChar == 'a': returnList.append(PHPValue.PEVT_ARRAY) self.parseArray(returnList) elif typeChar == 's': returnList.append(PHPValue.PEVT_STRING) self.parseString(returnList) elif typeChar == 'O': returnList.append(PHPValue.PEVT_OBJECT) self.parseObject(returnList) elif typeChar == 'r': returnList.append(PHPValue.PEVT_SOFTREF) self.parseReference(returnList, isSoftRef = True) elif typeChar == 'R': returnList.append(PHPValue.PEVT_REF) self.parseReference(returnList, isSoftRef = False) elif typeChar == 'b': returnList.append(PHPValue.PEVT_BOOLEAN) self.parseBoolean(returnList) elif typeChar == 'd': returnList.append(PHPValue.PEVT_DOUBLE) self.parseDouble(returnList) elif typeChar == 'z': returnList.append(PHPValue.PEVT_RESOURCE) self.parseResource(returnList) elif typeChar == 'N': returnList.append(PHPValue.PEVT_NULL) self.parseNull(returnList) else: myprint("PHPDBGEvalStr::parseAnEntity(): unknown data type: %s", typeChar) return returnList def parseInt(self, returnList): myprint("enter parseInt().") returnList.append(self.getAnIntStr(';')) return def parseArray(self, returnList): myprint("enter parseArray().") # # The shortest array is 'a:0:{}'. # if len(self.dataStr) < 4: myprint("PHPDBGEvalStr::parseArray(): failed (1) to parse an array: %s.", repr(self.dataStr)) return expectedNumItems = self.getAnInt(':') if len(self.dataStr) < 2 or self.dataStr[0] != '{': myprint("PHPDBGEvalStr::parseArray(): failed (3) to parse an array: %s.", repr(self.dataStr)) return self.dataStr = self.dataStr[1:] varList = [] while self.dataStr and len(self.dataStr) > 0 and self.dataStr[0] != '}': tmpList = self.parseAVariable() if not tmpList or len(tmpList) != 1 or not tmpList[0]: myprint("PHPDBGEvalStr::parseArray(): failed (4) to parse an array. dataStr=%s.", repr(self.dataStr)) break else: varList.append(tmpList[0]) if expectedNumItems != len(varList): myprint("PHPDBGEvalStr::parseArray(): failed (5) expected no. of items=%d, but got %d", (expectedNumItems, len(varList))) # # An array should end with a '}'. # if self.dataStr and len(self.dataStr) > 0 and self.dataStr[0] == '}': self.dataStr = self.dataStr[1:] returnList.extend(varList) else: myprint("PHPDBGEvalStr::parseArray(): failed (6) to parse an array. dataStr=%s.", repr(self.dataStr)) myprint("parseArray() ends.") return def parseString(self, returnList, endChar = ';'): myprint("enter parseString().")
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -