From: Mark Florisson Date: Tue, 21 Sep 2010 14:46:50 +0000 (+0200) Subject: Put debugger startup code in Cython.Debugger.cygdb X-Git-Tag: 0.14.beta0~1^2~56 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=29e61a09e5fe337d35bf6cc54e548ca0205e4058;p=cython.git Put debugger startup code in Cython.Debugger.cygdb Fixed small autocompletion bug --- diff --git a/Cython/Debugger/cygdb.py b/Cython/Debugger/cygdb.py new file mode 100644 index 00000000..9c45dfae --- /dev/null +++ b/Cython/Debugger/cygdb.py @@ -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 diff --git a/Cython/Debugger/libcython.py b/Cython/Debugger/libcython.py index 7462230e..49f483ce 100644 --- a/Cython/Debugger/libcython.py +++ b/Cython/Debugger/libcython.py @@ -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: diff --git a/bin/cygdb b/bin/cygdb index ec6ae6e4..8c52f9f2 100755 --- 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() diff --git a/cygdb.py b/cygdb.py index ec6ae6e4..8c52f9f2 100644 --- 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()