import os
import pango
import pty
+import re
import string
import sys
import time
def initialize(self):
self.childpid = self.fork_command( self.getCommand(), self.getArgv())
- self.waitForActivation(0)
+ self.waitForPrompt(0)
self.setPty(self.client_ptyslave)
def stopDbg(self):
assert( self.getHistoryLen()>0 )
c,r = term.get_cursor_position()
- text = self.get_text_range(self.lastr,self.lastc,r,c-1,lambda *w:True)
+ text = self.get_text_range(self.lastr,0,r,c,lambda *w:True)
self.lastc, self.lastr = c,r
#Remove annoying \n at the end
assert(text[-1] == "\n")
text = text[:-1]
+
#Get the lines and remove empty lines
lines = string.split(text, "\n")
#Remove the incomplete line
len = max(0,self.getHistoryLen())
- self.history[-1] += lines[0]
+ self.history[-1] = lines[0]
self.history += lines[1:]
def getHistoryLen(self):
return len(self.history)
- def waitForRx(self, rx, start):
+ def waitForRx(self, pat, start):
+
+ rx = re.compile(pat)
curr = start
while True:
assert( curr>=start )
#Do not forget the last line
curr = max(start,self.getHistoryLen()-1)
- gtk.main_iteration()
+ lr, lc = self.lastr, self.lastc
+
+ while (self.lastr, self.lastc) == (lr,lc):
+ gtk.main_iteration()
def getCommand(self):
def getExpression(self, expr):
raise NotImplementedError()
- def waitForActivation(self, his):
+ def waitForPrompt(self, his):
raise NotImplementedError()
def testForActivity(self, his):
def getArgv(self):
return ["gdb", "--fullname", string.split(self.clientCmd)[0]]
- def setPty(self, pty):
- ttyname = os.ttyname(pty)
- self.feed_child("set inferior-tty %s\n" % (ttyname,))
-
def setRun(self):
argv = string.join(string.split(self.clientCmd)[1:])
self.feed_child("run " + argv + "\n")
self.waitForNewline()
self.feed_child("y\n");
+ def setPty(self, pty):
+ ttyname = os.ttyname(pty)
+ len = self.getHistoryLen()
+ self.feed_child("set inferior-tty %s\n" % (ttyname,))
+ self.waitForPrompt(len)
+
def setBreakpoint(self, file, lineno, condition=None):
his = self.getHistoryLen()
if condition==None:
self.feed_child("break %s:%s if %s\n" % \
(file, str(lineno), condition))
- rx = re.compile("^Breakpoint |^No |^\(gdb\) ")
+ rx = "^Breakpoint |^No |^\(gdb\) "
his, response = self.waitForRx(rx, his)
answer = None
self.feed_child("n\n");
#Wait again for (gdb)...
- self.waitForActivation(his)
+ self.waitForPrompt(his)
return answer
def delBreakpoint(self, breakpoint):
his = self.getHistoryLen()
self.feed_child("del breakpoint %s\n" % (breakpoint,))
- self.waitForActivation(his)
+ self.waitForPrompt(his)
def getBreakpoints(self):
starthis = self.getHistoryLen()
self.feed_child("info breakpoints\n")
- endhis, response = self.__waitForPrompt(starthis)
+ endhis, response = self.waitForPrompt(starthis)
rxbp = re.compile("^\d+\s+breakpoint")
rxpos = re.compile("^.* at \S+:\d+$")
his = self.getHistoryLen()
self.feed_child("print " + expr + "\n")
- his, response = self.__waitForPrompt(his)
+ his, response = self.waitForPrompt(his)
answer = self.history[his-1]
if len(string.split(answer, "=")) == 1:
return string.join(split[1:], "=").strip()
- def waitForActivation(self, starthis):
-
- self.setActive(False)
- endhis, response = self.__waitForPrompt(starthis)
- self.setActive(True)
-
- for his in reversed(range(starthis+1,endhis)):
- if self.history[his][0:2]=="\x1a\x1a":
- tuples = string.split(self.history[his][2:], ":")
- return tuples[0], int(tuples[1])
-
- return None
-
-
- def __waitForPrompt(self, his):
- rx = re.compile("^\(gdb\) ")
+ def waitForPrompt(self, his):
+ rx = "^\(gdb\)"
return self.waitForRx(rx,his)
def testForActivity(self, his):
"""Test whether debugger got active again"""
- rx = re.compile("^\(gdb\) ")
+
+ line = self.history[his]
+
+ if string.find(line, "\x1a\x1a") == 0:
+ tuples = string.split(line[2:], ":")
+ tuples[1] = int(tuples[1])
+ return "break", [tuples[0], int(tuples[1])]
- #Aha! There is a prompt...
- if rx.search(self.history[his]):
- line = self.history[his-1]
+ if string.find(line, "Program exited") == 0:
+ code = string.split(line)[-1]
+ code = code[1:-1]
- if line[0:2]=="\x1a\x1a":
- tuples = string.split(line[2:], ":")
- tuples[1] = int(tuples[1])
- return "break", [tuples[0], int(tuples[1])]
+ codeno = 0
+ for c in code:
+ codeno = codeno*8 + int(c)
- if string.find(line, "Program exited") == 0:
- code = string.split(line)[-1]
- code = code[:-1]
- return "exited", code
+ return "exited", codeno
return None