]> granicus.if.org Git - python/commitdiff
Better debugger support (show stack etc).
authorGuido van Rossum <guido@python.org>
Fri, 16 Oct 1998 16:12:11 +0000 (16:12 +0000)
committerGuido van Rossum <guido@python.org>
Fri, 16 Oct 1998 16:12:11 +0000 (16:12 +0000)
Tools/idle/Debugger.py
Tools/idle/PyShell.py

index a65703f1a9fda137d913adb541ced38359379927..d414b6714c2489218d5561da34e0e5c92f7e2e90 100644 (file)
@@ -43,27 +43,50 @@ class Debugger(bdb.Bdb):
         self.root = root = pyshell.root
         self.top = top = Toplevel(root)
         top.wm_protocol("WM_DELETE_WINDOW", self.close)
+        #
         self.bframe = bframe = Frame(top)
         self.bframe.pack(anchor="w")
         self.buttons = bl = []
+        #
         self.bcont = b = Button(bframe, text="Go", command=self.cont)
         bl.append(b)
-        self.bstep = b = Button(bframe, text="Step into", command=self.step)
+        self.bstep = b = Button(bframe, text="Into", command=self.step)
         bl.append(b)
-        self.bnext = b = Button(bframe, text="Step over", command=self.next)
+        self.bnext = b = Button(bframe, text="Over", command=self.next)
         bl.append(b)
-        self.bret = b = Button(bframe, text="Step out", command=self.ret)
+        self.bret = b = Button(bframe, text="Out", command=self.ret)
         bl.append(b)
+        #
         for b in bl:
             b.configure(state="disabled")
             b.pack(side="left")
+        #
+        self.cframe = cframe = Frame(bframe)
+        self.cframe.pack(side="left")
+        #
+        self.vstack = BooleanVar(top)
+        self.bstack = Checkbutton(cframe,
+            text="Stack", command=self.show_stack, variable=self.vstack)
+        self.bstack.grid(row=0, column=0)
+        self.vsource = BooleanVar(top)
+        self.bsource = Checkbutton(cframe,
+            text="Source", command=self.show_source, variable=self.vsource)
+        self.bsource.grid(row=0, column=0)
+        self.vlocals = BooleanVar(top)
+        self.blocals = Checkbutton(cframe,
+            text="Locals", command=self.show_locals, variable=self.vlocals)
+        self.blocals.grid(row=1, column=0)
+        self.vglobals = BooleanVar(top)
+        self.bglobals = Checkbutton(cframe,
+            text="Globals", command=self.show_globals, variable=self.vglobals)
+        self.bglobals.grid(row=1, column=1)
+        #
         self.status = Label(top, anchor="w")
         self.status.pack(anchor="w")
         self.error = Label(top, anchor="w")
         self.error.pack(anchor="w")
     
     def interaction(self, frame, info=None):
-        self.top.pack_propagate(0)
         self.frame = frame
         code = frame.f_code
         file = code.co_filename
@@ -86,11 +109,14 @@ class Debugger(bdb.Bdb):
                     pass
         else:
             m1 = ""
+            tb = None
         self.error.configure(text=m1)
-        if file[:1] + file[-1:] != "<>" and os.path.exists(file):
-            edit = self.flist.open(file)
-            if edit:
-                edit.gotoline(lineno)
+        sv = self.stackviewer
+        if sv:
+            stack, i = self.get_stack(self.frame, tb)
+            sv.load_stack(stack, i)
+        if self.vsource.get():
+            self.sync_source_line()
         for b in self.buttons:
             b.configure(state="normal")
         self.top.tkraise()
@@ -101,6 +127,18 @@ class Debugger(bdb.Bdb):
         self.error.configure(text="")
         self.frame = None
     
+    def sync_source_line(self):
+        frame = self.frame
+        if not frame:
+            return
+        code = frame.f_code
+        file = code.co_filename
+        lineno = frame.f_lineno
+        if file[:1] + file[-1:] != "<>" and os.path.exists(file):
+            edit = self.flist.open(file)
+            if edit:
+                edit.gotoline(lineno)
+    
     def cont(self):
         self.set_continue()
         self.root.quit()
@@ -116,3 +154,30 @@ class Debugger(bdb.Bdb):
     def ret(self):
         self.set_return(self.frame)
         self.root.quit()
+
+    stackviewer = None
+
+    def show_stack(self):
+        if not self.stackviewer and self.vstack.get():
+            import StackViewer
+            self.stackviewer = sv = StackViewer.StackViewer(
+                self.top, self.flist, self)
+            if self.frame:
+        else:
+            sv = self.stackviewer
+            if sv and not self.vstack.get():
+                self.stackviewer = None
+                sv.close()
+    
+    def show_source(self):
+        if self.vsource.get():
+            self.sync_source_line()
+
+    def show_frame(self, (frame, lineno)):
+        print frame, lineno
+
+    def show_locals(self):
+        pass
+    
+    def show_globals(self):
+        pass
index a794defbfb9464c390b165216f776f0b5c4986a7..c81b6664cff0425d9e010cc046d39fc94b2e515a 100644 (file)
@@ -3,6 +3,7 @@
 import os
 import sys
 import string
+import getopt
 import re
 
 import linecache
@@ -552,8 +553,8 @@ class PyShell(PyShellEditorWindow):
                 "(sys.last_traceback is not defined)",
                 master=self.text)
             return
-        from StackViewer import StackViewer
-        sv = StackViewer(self.root, self.flist)
+        from StackViewer import StackBrowser
+        sv = StackBrowser(self.root, self.flist)
 
     def showprompt(self):
         self.resetoutput()
@@ -599,17 +600,28 @@ class PseudoFile:
 
 
 def main():
+    debug = 0
+    try:
+        opts, args = getopt.getopt(sys.argv[1:], "d")
+    except getopt.error, msg:
+        sys.stderr.write("Error: %s\n" % str(msg))
+        sys.exit(2)
+    for o, a in opts:
+        if o == "-d":
+            debug = 1
     global flist, root
     root = Tk()
     fixwordbreaks(root)
     root.withdraw()
     flist = PyShellFileList(root)
-    if sys.argv[1:]:
+    if args:
         for filename in sys.argv[1:]:
             flist.open(filename)
     t = PyShell(flist)
     flist.pyshell = t
     t.begin()
+    if debug:
+        t.open_debugger()
     root.mainloop()
 
 if __name__ == "__main__":