def __init__(self): self.core = False self.log = Logger("Gdb") self.factory = CommandFactory() self.state = GDBState() self.fileLocationListeners = [] self.binary = 'gdb'
class GDB(): def __init__(self): self.core = False self.log = Logger("Gdb") self.factory = CommandFactory() self.state = GDBState() self.fileLocationListeners = [] self.binary = 'gdb' def __del__(self): if self.isConnected(): self.disconnect() def gdbBinary(self, binary): self.binary = binary def connectApp(self, apppath): if self.isConnected() == True: raise AlreadyConnectedError() self.apppath = apppath handle = open(self.apppath) handle.close() arguments = [self.binary, '-n', '-i', 'mi', '-q', self.apppath] self.connect(arguments) self.changeDirectory(path.dirname(arguments[5])) def connectCore(self, apppath, corepath): if self.isConnected() == True: raise AlreadyConnectedError() self.apppath = apppath arguments = [ self.binary, '-n', '-i', 'mi', '-q', self.apppath, corepath ] self.connect(arguments) def connectRemote(self, host): if (self.isConnected() == True): raise AlreadyConnectedError() self.host = host arguments = [self.binary, '-n', '-i', 'mi', '-q'] self.connect(arguments) self.checkConnection() cmd = self.factory.createTargetCommand(host) self.gdbserver.send(cmd) if cmd.getTimeoutError() == True: raise TimeoutError('Connection timed out.') def connect(self, arguments): if self.isConnected() == True: raise AlreadyConnectedError() self.process = subprocess.Popen(arguments, shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE) self.gdbserver = GDBServer(self.process) self.gdbserver.start() self.state.setConnected(True) def addNewFileLocationListener(self, listener): self.fileLocationListeners.append(listener) def newFileLocationListeners(self): return self.fileLocationListeners def removeNewFileLocationListener(self, listener): self.fileLocationListeners.remove(listener) def setTty(self, tty): self.checkConnection() cmd = self.factory.createTtyCommand(tty) self.gdbserver.send(cmd) def addExitListener(self, listener): self.exitListeners.append(listener) def changeDirectory(self, directory): self.checkConnection() cmd = self.factory.createChangeDirectoryCommand(directory) self.gdbserver.send(cmd) def setCore(self, value): self.checkConnection() self.core = value def getSourceCodeFiles(self): self.checkConnection() cmd = self.factory.createInfoSourceCommand() self.gdbserver.send(cmd) return cmd.getSourceFiles() def symbolFile(self, symbol): self.checkConnection() cmd = self.factory.createSymbolFileCommand(symbol) self.gdbserver.send(cmd) return cmd.getSymbolFile() def load(self, symbol): self.checkConnection() cmd = self.factory.createLoadCommand(symbol) self.gdbserver.send(cmd) def addBreakpoint(self, filename, line): self.checkConnection() cmd = self.factory.createAddBreakpointCommand(filename, line) self.gdbserver.send(cmd) def getBreakpoints(self): self.checkConnection() cmd = self.factory.createInfoBreakpointCommand() self.gdbserver.send(cmd) breakpoints = cmd.getBreakpoints() files = self.getSourceCodeFiles() for b in breakpoints: for f in files: if b.getSourceFile() == f['file']: b.setSourceFile(f['fullname']) return breakpoints def deleteBreakpoint(self, number): self.checkConnection() cmd = self.factory.createDeleteBreakpointCommand(number) self.gdbserver.send(cmd) def deleteAllBreakpoints(self): self.checkConnection() cmd = self.factory.createDeleteAllBreakpointsCommand() self.gdbserver.send(cmd) def addWatchpoint(self): self.checkConnection() def deleteWatchpoint(self): self.checkConnection() def infoThreads(self): self.checkConnection() def addDirectory(self, directory): self.checkConnection() cmd = self.factory.createAddDirectoryCommand(directory) self.gdbserver.send(cmd) def checkConnection(self): if not self.isConnected(): raise NotConnectedError( "GDB must be connected before using this method") def run(self, arguments): self.checkConnection() cmd = self.factory.createRunCommand(arguments) self.gdbserver.send(cmd) location = cmd.getLocation() if location.has_key('fullname'): self.log.debug("Reporting new location: " + location['fullname'] + ":" + str(location['line'])) self.updateNewFileLocationListeners(location['fullname'], location['line']) def step(self): self.checkConnection() cmd = self.factory.createStepCommand() self.gdbserver.send(cmd) location = cmd.getLocation() if location.has_key('fullname'): self.log.debug("Reporting new location: " + location['fullname'] + ":" + str(location['line'])) self.updateNewFileLocationListeners(location['fullname'], location['line']) def next(self): self.checkConnection() cmd = self.factory.createNextCommand() self.gdbserver.send(cmd) location = cmd.getLocation() if location.has_key('fullname'): self.log.debug("Reporting new location: " + location['fullname'] + ":" + str(location['line'])) self.updateNewFileLocationListeners(location['fullname'], location['line']) def p(self, expression): self.checkConnection() cmd = self.factory.createPrintCommand(expression) self.gdbserver.send(cmd) value = cmd.getResult() return value def backtrace(self): self.checkConnection() cmd = self.factory.createBacktraceCommand() self.gdbserver.send(cmd) self.observer.printBacktrace(cmd.getBacktrace()) def updateNewFileLocationListeners(self, newFile, newLine): for listener in self.fileLocationListeners: listener.newFileLocation(newFile, newLine) def finish(self): self.checkConnection() def until(self): self.checkConnection() def clear(self, filename, lineNumber): self.checkConnection() cmd = self.factory.createClearCommand(filename, lineNumber) self.gdbserver.send(cmd) def continueExecution(self): self.checkConnection() cmd = self.factory.createContinueCommand() self.gdbserver.send(cmd) def whatIs(self, variable): self.checkConnection() def setVar(self, variable, value): self.checkConnection() def jump(self): self.checkConnection() def call(self): self.checkConnection() def returnExecution(self): self.checkConnection() def getState(self): return self.state def disconnect(self): self.checkConnection() self.gdbserver.stopserver() self.state.setConnected(False) #self.monitor.destroy() def isConnected(self): return self.state.isConnected()
class GDB(): def __init__(self): self.core = False self.log = Logger("Gdb") self.factory = CommandFactory() self.state = GDBState() self.fileLocationListeners = [] self.binary = 'gdb' def __del__(self): if self.isConnected(): self.disconnect() def gdbBinary(self, binary): self.binary = binary def connectApp(self, apppath): if self.isConnected() == True: raise AlreadyConnectedError() self.apppath = apppath handle = open(self.apppath); handle.close(); arguments = [self.binary,'-n','-i','mi','-q',self.apppath] self.connect(arguments) self.changeDirectory(path.dirname(arguments[5])) def connectCore(self,apppath,corepath): if self.isConnected() == True: raise AlreadyConnectedError() self.apppath = apppath arguments = [self.binary,'-n', '-i','mi','-q', self.apppath, corepath] self.connect(arguments) def connectRemote(self, host): if(self.isConnected() == True): raise AlreadyConnectedError() self.host = host arguments = [self.binary,'-n', '-i','mi','-q'] self.connect(arguments) self.checkConnection() cmd = self.factory.createTargetCommand(host) self.gdbserver.send(cmd) if cmd.getTimeoutError() == True: raise TimeoutError('Connection timed out.') def connect(self,arguments): if self.isConnected() == True: raise AlreadyConnectedError() self.process = subprocess.Popen(arguments, shell=False,stdin=subprocess.PIPE, stdout = subprocess.PIPE) self.gdbserver = GDBServer(self.process) self.gdbserver.start() self.state.setConnected(True) def addNewFileLocationListener(self, listener): self.fileLocationListeners.append(listener) def newFileLocationListeners(self): return self.fileLocationListeners def removeNewFileLocationListener(self, listener): self.fileLocationListeners.remove(listener) def setTty(self, tty): self.checkConnection(); cmd = self.factory.createTtyCommand(tty) self.gdbserver.send(cmd) def addExitListener(self, listener): self.exitListeners.append(listener) def changeDirectory(self,directory): self.checkConnection(); cmd = self.factory.createChangeDirectoryCommand(directory) self.gdbserver.send(cmd) def setCore(self,value): self.checkConnection() self.core = value def getSourceCodeFiles(self): self.checkConnection() cmd = self.factory.createInfoSourceCommand() self.gdbserver.send(cmd) return cmd.getSourceFiles() def symbolFile(self, symbol): self.checkConnection() cmd = self.factory.createSymbolFileCommand(symbol) self.gdbserver.send(cmd) return cmd.getSymbolFile() def load(self, symbol): self.checkConnection() cmd = self.factory.createLoadCommand(symbol) self.gdbserver.send(cmd) def addBreakpoint(self, filename, line): self.checkConnection(); cmd = self.factory.createAddBreakpointCommand(filename,line) self.gdbserver.send(cmd) def getBreakpoints(self): self.checkConnection(); cmd = self.factory.createInfoBreakpointCommand() self.gdbserver.send(cmd) breakpoints = cmd.getBreakpoints() files = self.getSourceCodeFiles() for b in breakpoints: for f in files: if b.getSourceFile() == f['file']: b.setSourceFile(f['fullname']) return breakpoints def deleteBreakpoint(self, number): self.checkConnection() cmd = self.factory.createDeleteBreakpointCommand(number) self.gdbserver.send(cmd) def deleteAllBreakpoints(self): self.checkConnection() cmd = self.factory.createDeleteAllBreakpointsCommand() self.gdbserver.send(cmd) def addWatchpoint(self): self.checkConnection(); def deleteWatchpoint(self): self.checkConnection(); def infoThreads(self): self.checkConnection(); def addDirectory(self,directory): self.checkConnection(); cmd = self.factory.createAddDirectoryCommand(directory) self.gdbserver.send(cmd) def checkConnection(self): if not self.isConnected(): raise NotConnectedError("GDB must be connected before using this method"); def run(self, arguments): self.checkConnection() cmd = self.factory.createRunCommand(arguments) self.gdbserver.send(cmd) location = cmd.getLocation() if location.has_key('fullname'): self.log.debug("Reporting new location: " + location['fullname'] +":"+str(location['line'])) self.updateNewFileLocationListeners(location['fullname'], location['line']) def step(self): self.checkConnection(); cmd = self.factory.createStepCommand() self.gdbserver.send(cmd) location = cmd.getLocation() if location.has_key('fullname'): self.log.debug("Reporting new location: " + location['fullname'] +":"+str(location['line'])) self.updateNewFileLocationListeners(location['fullname'], location['line']) def next(self): self.checkConnection(); cmd = self.factory.createNextCommand() self.gdbserver.send(cmd) location = cmd.getLocation() if location.has_key('fullname'): self.log.debug("Reporting new location: " + location['fullname'] +":"+str(location['line'])) self.updateNewFileLocationListeners(location['fullname'], location['line']) def p(self, expression): self.checkConnection() cmd = self.factory.createPrintCommand(expression) self.gdbserver.send(cmd) value = cmd.getResult() return value def backtrace(self): self.checkConnection(); cmd = self.factory.createBacktraceCommand() self.gdbserver.send(cmd) self.observer.printBacktrace(cmd.getBacktrace()) def updateNewFileLocationListeners(self, newFile, newLine): for listener in self.fileLocationListeners: listener.newFileLocation(newFile, newLine) def finish(self): self.checkConnection(); def until(self): self.checkConnection(); def clear(self, filename, lineNumber): self.checkConnection(); cmd = self.factory.createClearCommand(filename, lineNumber) self.gdbserver.send(cmd) def continueExecution(self): self.checkConnection(); cmd = self.factory.createContinueCommand() self.gdbserver.send(cmd) def whatIs(self,variable): self.checkConnection(); def setVar(self, variable, value): self.checkConnection(); def jump(self): self.checkConnection(); def call(self): self.checkConnection(); def returnExecution(self): self.checkConnection(); def getState(self): return self.state def disconnect(self): self.checkConnection(); self.gdbserver.stopserver() self.state.setConnected(False) #self.monitor.destroy() def isConnected(self): return self.state.isConnected()