842f76862123027b809e690aebab5fda54ae220b
17 class GdbTerminal (DbgTerminal
.DbgTerminal
):
20 def __init__(self
, clientCmd
):
21 DbgTerminal
.DbgTerminal
.__init
__(self
, clientCmd
)
24 return ["gdb", "--fullname", string
.split(self
.clientCmd
)[0]]
27 argv
= string
.join(string
.split(self
.clientCmd
)[1:])
28 self
.feed_child("run " + argv
+ "\n")
30 def setContinue(self
):
31 self
.feed_child("cont\n");
33 def setStepover(self
):
34 self
.feed_child("next\n");
37 self
.feed_child("step\n");
40 bt
= self
.getBacktrace()
49 #Check if it is a backtrace line
50 if re
.compile("^#1\s+.*\s\S+:\d+$").search(sec
):
51 pos
= string
.split(sec
)[-1]
52 self
.feed_child("advance %s\n" % pos
)
56 self
.feed_child("quit\n")
58 self
.feed_child("y\n");
60 def setPty(self
, pty
):
61 ttyname
= os
.ttyname(pty
)
62 self
.__getAnswerFromCmd
("set inferior-tty %s\n" % (ttyname
,))
64 def setBreakpoint(self
, file, lineno
, condition
=None):
65 his
= self
.getHistoryLen()
67 self
.feed_child("break %s:%s\n" % (file, str(lineno
)))
69 self
.feed_child("break %s:%s if %s\n" % \
70 (file, str(lineno
), condition
))
72 rx
= "^Breakpoint |^No |^\(gdb\) "
73 his
, response
= self
.waitForRx(rx
, his
)
77 if response
[0:10] == "Breakpoint":
78 answer
= string
.split(response
)[1].strip()
80 #Wants an answer: "No"
81 if response
[0:14] == "No source file":
82 self
.feed_child("n\n");
84 #Wait again for (gdb)...
85 self
.waitForPrompt(his
)
90 def delBreakpoint(self
, breakpoint
):
91 self
.__getAnswerFromCmd
("del breakpoint %s\n" % (breakpoint
,))
94 def getBreakpoints(self
):
95 bplines
= self
.__getAnswerFromCmd
("info breakpoints\n")
97 rxbp
= re
.compile("^\d+\s+breakpoint")
98 rxpos
= re
.compile("^.*at\s+\S+:\d+$")
99 rxcond
= re
.compile("^\s+stop only if")
104 #Parse the resulting lines
105 while i
<len(bplines
):
108 if not rxbp
.search(line
):
112 #Get number of breakpoint
113 no
= string
.split(line
)[0]
115 #This line does not contain the file!
116 #Check for next line...
117 if not rxpos
.search(line
):
120 if not rxpos
.search(line
):
124 pos
= string
.split(line
)[-1]
125 [file,lineno
] = string
.split(pos
,":")
129 if i
+1<len(bplines
) and rxcond
.search(bplines
[i
+1]):
132 cond
= string
.join(string
.split(line
," if ")[1:], " if ")
135 bpnts
+= [[no
, file, lineno
, cond
]]
142 def getExpression(self
, expr
):
143 answer
= self
.__getAnswerFromCmd
("print " + expr
+ "\n")
146 if len(string
.split(answer
, "=")) == 1:
147 return answer
.strip()
149 split
= string
.split(answer
, "=")
150 return string
.join(split
[1:], "=").strip()
153 def listCodeSnippet(self
):
154 return self
.__getAnswerFromCmd
("list\n")
156 def getBacktrace(self
):
159 answ
= self
.__getAnswerFromCmd
("bt\n")
161 rxstartfull
= re
.compile("^\#\d+\s+0x[0-9a-f]+\s+in\s+\S+\s+\(")
162 rxstartshort
= re
.compile("^\#\d+\s+\S+\s+\(")
163 rxpos
= re
.compile("at \S+:\d+$")
171 while not rxstartfull
.search(line
) and not rxstartshort
.search(line
):
172 print "Warning: '", line
, "' does not match bt entry."
178 if rxstartfull
.search(line
):
186 #Search for file position
187 while not rxpos
.search(line
):
188 print "Warning: '", line
, "' does not match file pos marker."
194 [file,lineno
] = pos
.split(":")
196 stack
+= [[addr
,func
,file,lineno
]]
205 def waitForPrompt(self
, his
):
207 return self
.waitForRx(rx
,his
)
209 def __getAnswerFromCmd(self
, cmd
):
210 starthis
= self
.getHistoryLen()
212 endhis
, response
= self
.waitForPrompt(starthis
)
214 return self
.history
[starthis
:endhis
]
217 def testForActivity(self
, his
):
218 """Test whether debugger got active again"""
220 line
= self
.history
[his
]
222 if string
.find(line
, "\x1a\x1a") == 0:
223 tuples
= string
.split(line
[2:], ":")
224 tuples
[1] = int(tuples
[1])
225 return "break", [tuples
[0], int(tuples
[1])]
227 if string
.find(line
, "Program exited") == 0:
228 code
= string
.split(line
)[-1]
232 #Parse the octal number
236 codeno
= codeno
*8 + int(c
)
238 return "exited", codeno
243 def testForInactivity(self
, his
):
244 """Test whether debugger got inactive"""
245 line
= self
.history
[his
]
247 if string
.find(line
, "Starting program:") == 0:
248 prog
= string
.join( string
.split(line
)[1:])
249 return "started", prog
251 if string
.find(line
, "Continuing.") == 0:
252 return "continued", None
254 if string
.find(line
, "\x1a\x1a") == 0:
255 rxcont
= re
.compile("^\(gdb\)\s+(cont|step|next|stepi|nexti|advance)")
257 if rxcont
.search(self
.history
[his
-1]):
258 return "stepped", None
259 if rxcont
.search(self
.history
[his
-2]):
260 return "stepped", None
271 if __name__
== "__main__":
274 dbgterm
= GdbTerminal(string
.join(sys
.argv
[1:]))
275 dbgwnd
= DbgTerminal
.DbgWindow(dbgterm
)