11import os
22import bdb
3+ import types
34import traceback
45from Tkinter import *
56from WindowList import ListedToplevel
67
78import StackViewer
89
910
10- class Debugger (bdb .Bdb ):
11+ class Idb (bdb .Bdb ):
12+
13+ def __init__ (self , gui ):
14+ self .gui = gui
15+ bdb .Bdb .__init__ (self )
16+
17+ def user_line (self , frame ):
18+ # get the currently executing function
19+ co_filename = frame .f_code .co_filename
20+ co_name = frame .f_code .co_name
21+ try :
22+ func = frame .f_locals [co_name ]
23+ if getattr (func , "DebuggerStepThrough" , 0 ):
24+ print "XXXX DEBUGGER STEPPING THROUGH"
25+ self .set_step ()
26+ return
27+ except :
28+ pass
29+ if co_filename in ('rpc.py' , '<string>' ):
30+ self .set_step ()
31+ return
32+ if co_filename .endswith ('threading.py' ):
33+ self .set_step ()
34+ return
35+ message = self .__frame2message (frame )
36+ self .gui .interaction (message , frame )
37+
38+ def user_exception (self , frame , info ):
39+ message = self .__frame2message (frame )
40+ self .gui .interaction (message , frame , info )
41+
42+ def __frame2message (self , frame ):
43+ code = frame .f_code
44+ filename = code .co_filename
45+ lineno = frame .f_lineno
46+ basename = os .path .basename (filename )
47+ message = "%s:%s" % (basename , lineno )
48+ if code .co_name != "?" :
49+ message = "%s: %s()" % (message , code .co_name )
50+ return message
1151
12- interacting = 0
1352
53+ class Debugger :
54+
55+ interacting = 0
1456 vstack = vsource = vlocals = vglobals = None
1557
16- def __init__ (self , pyshell ):
17- bdb .Bdb .__init__ (self )
58+ def __init__ (self , pyshell , idb = None ):
59+ if idb is None :
60+ idb = Idb (self )
1861 self .pyshell = pyshell
62+ self .idb = idb
1963 self .make_gui ()
2064
21- def canonic (self , filename ):
22- # Canonicalize filename -- called by Bdb
23- return os .path .normcase (os .path .abspath (filename ))
65+ def run (self , * args ):
66+ try :
67+ self .interacting = 1
68+ return self .idb .run (* args )
69+ finally :
70+ self .interacting = 0
2471
2572 def close (self , event = None ):
2673 if self .interacting :
@@ -31,24 +78,6 @@ def close(self, event=None):
3178 self .pyshell .close_debugger ()
3279 self .top .destroy ()
3380
34- def run (self , * args ):
35- try :
36- self .interacting = 1
37- return apply (bdb .Bdb .run , (self ,) + args )
38- finally :
39- self .interacting = 0
40-
41- def user_line (self , frame ):
42- self .interaction (frame )
43-
44- def user_return (self , frame , rv ):
45- # XXX show rv?
46- ##self.interaction(frame)
47- pass
48-
49- def user_exception (self , frame , info ):
50- self .interaction (frame , info )
51-
5281 def make_gui (self ):
5382 pyshell = self .pyshell
5483 self .flist = pyshell .flist
@@ -128,16 +157,8 @@ def make_gui(self):
128157
129158 frame = None
130159
131- def interaction (self , frame , info = None ):
160+ def interaction (self , message , frame , info = None ):
132161 self .frame = frame
133- code = frame .f_code
134- file = code .co_filename
135- base = os .path .basename (file )
136- lineno = frame .f_lineno
137- #
138- message = "%s:%s" % (base , lineno )
139- if code .co_name != "?" :
140- message = "%s: %s()" % (message , code .co_name )
141162 self .status .configure (text = message )
142163 #
143164 if info :
@@ -160,7 +181,7 @@ def interaction(self, frame, info=None):
160181 #
161182 sv = self .stackviewer
162183 if sv :
163- stack , i = self .get_stack (self .frame , tb )
184+ stack , i = self .idb . get_stack (self .frame , tb )
164185 sv .load_stack (stack , i )
165186 #
166187 self .show_variables (1 )
@@ -184,32 +205,34 @@ def sync_source_line(self):
184205 frame = self .frame
185206 if not frame :
186207 return
208+ filename , lineno = self .__frame2fileline (frame )
209+ if filename [:1 ] + filename [- 1 :] != "<>" and os .path .exists (filename ):
210+ self .flist .gotofileline (filename , lineno )
211+
212+ def __frame2fileline (self , frame ):
187213 code = frame .f_code
188- file = code .co_filename
214+ filename = code .co_filename
189215 lineno = frame .f_lineno
190- if file [:1 ] + file [- 1 :] != "<>" and os .path .exists (file ):
191- edit = self .flist .open (file )
192- if edit :
193- edit .gotoline (lineno )
216+ return filename , lineno
194217
195218 def cont (self ):
196- self .set_continue ()
219+ self .idb . set_continue ()
197220 self .root .quit ()
198221
199222 def step (self ):
200- self .set_step ()
223+ self .idb . set_step ()
201224 self .root .quit ()
202225
203226 def next (self ):
204- self .set_next (self .frame )
227+ self .idb . set_next (self .frame )
205228 self .root .quit ()
206229
207230 def ret (self ):
208- self .set_return (self .frame )
231+ self .idb . set_return (self .frame )
209232 self .root .quit ()
210233
211234 def quit (self ):
212- self .set_quit ()
235+ self .idb . set_quit ()
213236 self .root .quit ()
214237
215238 stackviewer = None
@@ -219,7 +242,7 @@ def show_stack(self):
219242 self .stackviewer = sv = StackViewer .StackViewer (
220243 self .fstack , self .flist , self )
221244 if self .frame :
222- stack , i = self .get_stack (self .frame , None )
245+ stack , i = self .idb . get_stack (self .frame , None )
223246 sv .load_stack (stack , i )
224247 else :
225248 sv = self .stackviewer
@@ -233,6 +256,7 @@ def show_source(self):
233256 self .sync_source_line ()
234257
235258 def show_frame (self , (frame , lineno )):
259+ # Called from OldStackViewer
236260 self .frame = frame
237261 self .show_variables ()
238262
@@ -295,15 +319,15 @@ def set_breakpoint_here(self, edit):
295319 text .tag_add ("BREAK" , "insert linestart" , "insert lineend +1char" )
296320
297321 # A literal copy of Bdb.set_break() without the print statement at the end
298- def set_break (self , filename , lineno , temporary = 0 , cond = None ):
299- import linecache # Import as late as possible
300- filename = self .canonic (filename )
301- line = linecache .getline (filename , lineno )
302- if not line :
303- return 'That line does not exist!'
304- if not self .breaks .has_key (filename ):
305- self .breaks [filename ] = []
306- list = self .breaks [filename ]
307- if not lineno in list :
308- list .append (lineno )
309- bp = bdb .Breakpoint (filename , lineno , temporary , cond )
322+ # def set_break(self, filename, lineno, temporary=0, cond = None):
323+ # import linecache # Import as late as possible
324+ # filename = self.canonic(filename)
325+ # line = linecache.getline(filename, lineno)
326+ # if not line:
327+ # return 'That line does not exist!'
328+ # if not self.breaks.has_key(filename):
329+ # self.breaks[filename] = []
330+ # list = self.breaks[filename]
331+ # if not lineno in list:
332+ # list.append(lineno)
333+ # bp = bdb.Breakpoint(filename, lineno, temporary, cond)
0 commit comments