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")
self.parseWatch(tail)
elif cmd == "int":
self.parseInt(tail)
+ elif cmd == "currpos":
+ self.parseCurrpos(tail)
else:
cnt -= 1
print "Unkown command", cmd
for s in self.ints:
self.__writeInt(f, s)
+ if self.isCurrposSet():
+ self.__writeCurrpos(f)
+
f.close()
return True
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:
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}
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:
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))
import os
import vte
+import Configuration
import DbgTerminal
import BreakpointsFrame
import PositionFrame
gtk.Window.__init__(self)
self.debugger = debugger
+ self.debugger.gotActiveCallback += [self.updateValues]
self.set_border_width(5)
self.set_title("Status")
WatchesFrame.WatchesFrame(debugger), \
BreakpointsFrame.BreakpointsFrame(debugger) ]
+ #Register callback after frames!
+ self.debugger.gotActiveCallback += [self.updateValues]
#First paned window
self.paned1 = gtk.VPaned()
for f in self.frames:
f.fillConfiguration(conf)
+
+ def updateValues(self, status, param):
+
+ conf = Configuration.Configuration()
+ self.fillConfiguration(conf)
+ conf.store(".pygdb.conf")
+
gdbBps = []
signnum = 0
clientcmd = ""
+execsign = None
def gdbLaunch():
global gdbterm, mainctrlwnd, statuswnd, gdbBps, clientcmd, gdbthread
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]:
vim.command(":e %s" % file)
except OSError:
print "Warning: file '%s' does not exist! (Wrong client command?)" % file
+ cmdset = False
return
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
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()