Put debugger startup code in Cython.Debugger.cygdb
authorMark Florisson <markflorisson88@gmail.com>
Tue, 21 Sep 2010 14:46:50 +0000 (16:46 +0200)
committerMark Florisson <markflorisson88@gmail.com>
Tue, 21 Sep 2010 14:46:50 +0000 (16:46 +0200)
Fixed small autocompletion bug

Cython/Debugger/cygdb.py [new file with mode: 0644]
Cython/Debugger/libcython.py
bin/cygdb
cygdb.py

diff --git a/Cython/Debugger/cygdb.py b/Cython/Debugger/cygdb.py
new file mode 100644 (file)
index 0000000..9c45dfa
--- /dev/null
@@ -0,0 +1,54 @@
+#!/usr/bin/env python
+
+"""
+The Cython debugger
+
+The current directory should contain a directory named 'cython_debug', or a
+path to the cython project directory should be given (the parent directory of
+cython_debug).
+"""
+
+import os
+import sys
+import glob
+import tempfile
+import subprocess
+
+def main(import_libpython=False, path_to_debug_info=os.curdir):
+    """
+    Start the Cython debugger. This tells gdb to import the Cython and Python
+    extensions (libpython.py and libcython.py) and it enables gdb's pending 
+    breakpoints
+    
+    import_libpython indicates whether we should just 'import libpython',
+    or import it from Cython.Debugger
+    
+    path_to_debug_info is the path to the cython_debug directory
+    """
+    debug_files = glob.glob(
+        os.path.join(path_to_debug_info, 'cython_debug/cython_debug_info_*'))
+
+    if not debug_files:
+        sys.exit('No debug files were found in %s. Aborting.' % (
+                 os.path.abspath(path_to_debug_info))) 
+        
+    fd, tempfilename = tempfile.mkstemp()
+    f = os.fdopen(fd, 'w')
+    f.write('set breakpoint pending on\n')
+    f.write('python from Cython.Debugger import libcython\n')
+    if import_libpython:
+        f.write('python import libpython')
+    else:
+        f.write('python from Cython.Debugger import libpython\n')
+    f.write('\n'.join('cy import %s\n' % fn for fn in debug_files))
+    f.close()
+    
+    p = subprocess.Popen(['gdb', '-command', tempfilename])
+    while True:
+        try:
+            p.wait()
+        except KeyboardInterrupt:
+            pass
+        else:
+            break
+    os.remove(tempfilename)
\ No newline at end of file
index 7462230e0a74b1dfc324a84f9e599e9ebe1be99f..49f483ceabab942b9cb01e7852ff6bd2c4f4ba47 100644 (file)
@@ -227,8 +227,8 @@ class CyBreak(gdb.Command):
     @dont_suppress_errors
     def complete(self, text, word):
         names = itertools.chain(functions_by_qualified_name, functions_by_name)
-        lastword = text.strip().split()[-1]
-        if '.' in lastword:
+        words = text.strip().split()
+        if words and '.' in words[-1]:
             compl = [n for n in functions_by_qualified_name 
                            if n.startswith(lastword)]
         else:
@@ -291,7 +291,8 @@ class CyPrint(gdb.Command):
         try:
             cython_function = self._get_current_cython_function()
         except NoCythonFunctionNameInFrameError:
-            print 'Unable to determine the name of the function in the current frame.'
+            print('Unable to determine the name of the function in the '
+                  'current frame.')
         except RuntimeError, e:
             print e.args[0]
         else:
index ec6ae6e45329a14745817d4bb5215b28232cc396..8c52f9f2ed5b35267ce17e22b24b231d668a0be4 100755 (executable)
--- a/bin/cygdb
+++ b/bin/cygdb
@@ -1,10 +1,11 @@
 #!/usr/bin/env python
 
 import sys
+
 from Cython.Debugger import cygdb
 
 if __name__ == '__main__':
     if len(sys.argv) > 1:
         cygdb.main(path_to_debug_info=sys.argv[1])
     else:
-        cygdb.main()
\ No newline at end of file
+        cygdb.main()
index ec6ae6e45329a14745817d4bb5215b28232cc396..8c52f9f2ed5b35267ce17e22b24b231d668a0be4 100644 (file)
--- a/cygdb.py
+++ b/cygdb.py
@@ -1,10 +1,11 @@
 #!/usr/bin/env python
 
 import sys
+
 from Cython.Debugger import cygdb
 
 if __name__ == '__main__':
     if len(sys.argv) > 1:
         cygdb.main(path_to_debug_info=sys.argv[1])
     else:
-        cygdb.main()
\ No newline at end of file
+        cygdb.main()