From b7f4eaf787ec9c54f36cce00bb294a8be2a862c3 Mon Sep 17 00:00:00 2001 From: Stefan Huber Date: Wed, 11 Jun 2008 18:05:21 +0200 Subject: [PATCH] - pygdb saves current executed line - vim loads current executed line - changed colors of highlited lines in vim --- Configuration.py | 38 ++++++++++++++++++- DbgTerminal.py | 4 +- PositionFrame.py | 4 +- StatusWindow.py | 11 ++++++ pygdb.vim | 97 +++++++++++++++++++++++++++++++++++------------- 5 files changed, 124 insertions(+), 30 deletions(-) diff --git a/Configuration.py b/Configuration.py index 1aeb258..6f08a20 100755 --- a/Configuration.py +++ b/Configuration.py @@ -13,13 +13,20 @@ import StatusWindow class Configuration: def __init__(self): + self.clear() + + + def clear(self): self.breakpoints = [] self.watches = [] self.ints = [] + self.currfile, self.currlineno = None, 0 def load(self, filename): try: + self.clear() + cnt = 0 #Parse all lines f = file(filename, "r") @@ -36,6 +43,8 @@ class Configuration: self.parseWatch(tail) elif cmd == "int": self.parseInt(tail) + elif cmd == "currpos": + self.parseCurrpos(tail) else: cnt -= 1 print "Unkown command", cmd @@ -59,6 +68,9 @@ class Configuration: for s in self.ints: self.__writeInt(f, s) + if self.isCurrposSet(): + self.__writeCurrpos(f) + f.close() return True @@ -103,6 +115,20 @@ class Configuration: def parseWatch(self, tail): self.addWatch(tail) + def parseCurrpos(self, tail): + + tail = tail.strip() + rx = re.compile("^[\w/\._\-]+:\d+$") + + if not rx.search(tail): + print "Wrong current position format:", tail + return + + [file,lineno] = string.split(tail, ":") + lineno = int(lineno) + + self.setCurrpos(file, lineno) + def __writeBreak(self, f, b): if b["cond"] != None: @@ -116,6 +142,9 @@ class Configuration: def __writeWatch(self, f, w): f.write("watch %(expr)s\n" % w) + def __writeCurrpos(self, f): + f.write("currpos %s:%d\n" % (self.currfile, self.currlineno)) + def addBreak(self, file, lineno, cond=None): bp = {"file" : file, "lineno" : lineno, "cond" : cond} @@ -132,6 +161,12 @@ class Configuration: if not w in self.watches: self.watches += [w] + def setCurrpos(self, file, lineno): + self.currfile, self.currlineno = file, lineno + + def isCurrposSet(self): + return self.currfile!=None + def findInt(self, name): for i in self.ints: @@ -143,7 +178,8 @@ class Configuration: def __str__(self): return "breakpoints=" + str(self.breakpoints) + \ ", watches=" + str(self.watches) + \ - ", ints=" + str(self.ints) + ", ints=" + str(self.ints) + \ + ", currpos=" + str((self.currfile, self.currlineno)) diff --git a/DbgTerminal.py b/DbgTerminal.py index f69d803..c854bba 100644 --- a/DbgTerminal.py +++ b/DbgTerminal.py @@ -81,8 +81,8 @@ class DbgTerminal (vte.Terminal): print "got inactive: ", res for cb in self.gotInactiveCallback: cb(status, param) - except: - pass + except Exception, e: + print e return True diff --git a/PositionFrame.py b/PositionFrame.py index 29bd6a7..ce82619 100644 --- a/PositionFrame.py +++ b/PositionFrame.py @@ -74,7 +74,7 @@ class PositionFrame (StatusFrame.StatusFrame): self.file, self.lineno = param self.positionLabel.set_label("%s:%d" % (self.file, self.lineno)) else: - self.file, self.lineno = None, 0 + self.file, self.lineno = None, None if status == "exited": self.positionLabel.set_label("Exited with code %d." % param) @@ -90,5 +90,5 @@ class PositionFrame (StatusFrame.StatusFrame): pass def fillConfiguration(self, conf): - pass + conf.setCurrpos(self.file, self.lineno) diff --git a/StatusWindow.py b/StatusWindow.py index 3209fed..3d77dea 100644 --- a/StatusWindow.py +++ b/StatusWindow.py @@ -10,6 +10,7 @@ import string import os import vte +import Configuration import DbgTerminal import BreakpointsFrame import PositionFrame @@ -23,6 +24,7 @@ class StatusWindow (gtk.Window): gtk.Window.__init__(self) self.debugger = debugger + self.debugger.gotActiveCallback += [self.updateValues] self.set_border_width(5) self.set_title("Status") @@ -41,6 +43,8 @@ class StatusWindow (gtk.Window): WatchesFrame.WatchesFrame(debugger), \ BreakpointsFrame.BreakpointsFrame(debugger) ] + #Register callback after frames! + self.debugger.gotActiveCallback += [self.updateValues] #First paned window self.paned1 = gtk.VPaned() @@ -88,3 +92,10 @@ class StatusWindow (gtk.Window): for f in self.frames: f.fillConfiguration(conf) + + def updateValues(self, status, param): + + conf = Configuration.Configuration() + self.fillConfiguration(conf) + conf.store(".pygdb.conf") + diff --git a/pygdb.vim b/pygdb.vim index fc03b84..e505b0a 100644 --- a/pygdb.vim +++ b/pygdb.vim @@ -24,6 +24,7 @@ import Configuration gdbBps = [] signnum = 0 clientcmd = "" +execsign = None def gdbLaunch(): global gdbterm, mainctrlwnd, statuswnd, gdbBps, clientcmd, gdbthread @@ -62,8 +63,42 @@ def gdbToggleBreakpoint(lineno=None, file=None): addBreakpoint(file, lineno) +def setExecutionLine(file, lineno): + global execsign + + + #Open that file! + if file != getCurrentFile(): + try: + os.stat(file) + vim.command(":e %s" % file) + except OSError: + print "Warning: file '%s' does not exist! (Wrong client command?)" % file + return + + #Jump to line + vim.command(":%d" % lineno) + + #Remove old execsign + if execsign != None: + delExecutionLine() + + #Set the sign + execsign = gdbNewSignnum() + vim.command("sign place %d line=%s name=ExecutionLine file=%s"%(execsign, lineno, file)) + + +def delExecutionLine(): + global execsign + + #Remove old execsign + if execsign != None: + vim.command("sign unplace %d" % execsign) + execsign = None + + def addBreakpoint(file, lineno, cond=None): - global gdbBps + global gdbBps, cmdset #If file is not open, open it if not file in [b.name for b in vim.buffers]: @@ -72,6 +107,7 @@ def addBreakpoint(file, lineno, cond=None): vim.command(":e %s" % file) except OSError: print "Warning: file '%s' does not exist! (Wrong client command?)" % file + cmdset = False return @@ -171,9 +207,32 @@ def getAbsPath(absfile, relfile): return string.join(abssplit + relsplit, os.sep) +#Change to absolute path +def toAbsPath(path): + global clientcmd, cmdset + + #Not a absolute path --> make one + if path[0] != os.sep: + + #We need the client command to expand the paths... + while clientcmd == "" or not cmdset: + clientcmd = vim.eval("input('Client commando: ', '%s')" % clientcmd).strip() + cmdset = True + + #Get the dirs where executeable is in + relcmd = string.split(clientcmd)[0] + abscmd = getAbsPath(getCurrentFile(), relcmd) + path = getAbsPath(abscmd, path) + + assert(path[0] == "/") + + return path + def gdbLoadConfig(): - global clientcmd, gdbBps + global clientcmd, gdbBps, cmdset + + #Load configuration @@ -185,38 +244,26 @@ def gdbLoadConfig(): removeBreakpoint(0) #Add breakpoints from configuration - cmdset = False for bp in conf.breakpoints: - - file = bp["file"] - - #Not a absolute path --> make one - if file[0] != os.sep: - - #We need the client command to expand the paths... - while clientcmd == "" or not cmdset: - clientcmd = vim.eval("input('Client commando: ', '%s')" % clientcmd).strip() - cmdset = True - - #Get the dirs where executeable is in - relcmd = string.split(clientcmd)[0] - abscmd = getAbsPath(getCurrentFile(), relcmd) - bp["file"] = file = getAbsPath(abscmd, file) - - assert(file[0] == "/") - + bp["file"] = toAbsPath( bp["file"] ) addBreakpoint(bp["file"], bp["lineno"], bp["cond"]) - + + #Set current execution line + if conf.isCurrposSet(): + file = toAbsPath(conf.currfile) + setExecutionLine(file, conf.currlineno) + else: + delExecutionLine() >> +highlight ExecutionLine term=bold ctermbg=DarkGreen ctermfg=Black guibg=LightGreen guifg=Black +highlight BreakPoint term=inverse ctermbg=DarkRed ctermfg=Black guibg=LightRed guifg=Black -highlight BreakPoint term=inverse ctermbg=DarkCyan ctermfg=Black - +sign define ExecutionLine text==> texthl=ExecutionLine linehl=ExecutionLine sign define BreakPoint text=! texthl=BreakPoint linehl=BreakPoint sign define CondBreakPoint text=? texthl=BreakPoint linehl=BreakPoint - command! GDBLaunch :python gdbLaunch() command! GDBToggleBreakpoint :python gdbToggleBreakpoint() command! GDBBreakpointCond :python gdbBreakpointCond() -- 2.39.5