--- /dev/null
+#!/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
@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:
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:
#!/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()