Cython调试,提出了一个突破点

Aka*_*all 12 debugging gdb cython

我正在尝试使用cython调试器来设置一个断点:

这是我的代码:

cython_file.pyx

cimport cython

def big_sum():
    cdef int a[10000]

    for i in range(10000):
        a[i] = i
    # <==================== I want to put a break here     
    cdef int my_sum
    my_sum = 0
    for i in range(1000):
        my_sum += a[i]
    return my_sum
Run Code Online (Sandbox Code Playgroud)

python_file.py

from cython_file import big_sum

result = big_sum()
print result
Run Code Online (Sandbox Code Playgroud)

setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

setup(
    cmdclass = {'build_ext': build_ext},
    ext_modules = [Extension("cython_file",
                             ["cython_file.pyx"], pyrex_gdb=True,
                             extra_compile_args=["-g"], extra_link_args=["-g"])]
)
Run Code Online (Sandbox Code Playgroud)

我按照这个指南:

这就是我在ubuntu shell中所做的:

cython --gdb cython_file.pyx
python setup.py build_ext --inplace
cygdb
Run Code Online (Sandbox Code Playgroud)

现在我在调试器内部,我应该能够设置一个断点,但是当我尝试时:

(gdb) cy break cython_file.big_sum :8

I get this error:

Function "__pyx_pw_11cython_file_1big_sum" not defined.
Breakpoint 1 (__pyx_pw_11cython_file_1big_sum) pending.
No frame is currently selected.
Run Code Online (Sandbox Code Playgroud)

我该如何正确设置断点?

更新:即使我使用Drew McInnis提供的setup.py,我仍然有问题:

user@Ubuntu-K56CA:~/PythonStuff/CythonStuff/cython_debug_2$ cython --gdb cython_file.pyx
user@Ubuntu-K56CA:~/PythonStuff/CythonStuff/cython_debug_2$ python setup.py build_ext --inplace
/usr/lib/python2.7/distutils/dist.py:267: UserWarning: Unknown distribution option: 'extensions'
  warnings.warn(msg)
running build_ext
building 'cython_file' extension
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c cython_file.c -o build/temp.linux-x86_64-2.7/cython_file.o
gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro build/temp.linux-x86_64-2.7/cython_file.o -o /home/user/PythonStuff/CythonStuff/cython_debug_2/cython_file.so
user@Ubuntu-K56CA:~/PythonStuff/CythonStuff/cython_debug_2$ cygdb .
GNU gdb (GDB) 7.5-ubuntu
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) cy run python_file.py
499500


(gdb) cy break cython_file.big_sum
Breakpoint 1 at 0x7ffff63e7780: file cython_file.c, line 649.
(gdb) cy run python_file.py
1    cimport cython
Run Code Online (Sandbox Code Playgroud)

我注意到我收到了这个警告:

user@Ubuntu-K56CA:~/PythonStuff/CythonStuff/cython_debug_2$ python setup.py build_ext --inplace

/usr/lib/python2.7/distutils/dist.py:267: UserWarning: Unknown distribution option: 'extensions
Run Code Online (Sandbox Code Playgroud)

这可能是问题吗?

我使用的是Cython版本0.19.1,Python 2.7.3和ubuntu 12.10.

Dre*_*nis 5

我相信你正确设置断点.在cython_file.so导入模块之前,解释器不会加载由cython创建的共享库.所以挂起的 gdb断点很好,因为gdb会在cython_file.so动态加载时设置这个断点.

更新1:我确实修改了setup.py发布的内容.我基于setup.py这些cython调试指令 ......主要区别在于使用cythonize:

setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize

setup(
    extensions = [Extension('cython_file', ["cython_file.pyx"])],
    ext_modules=cythonize(Extension("cython_file", ["cython_file.pyx"]),
                          gdb_debug=True)
)
Run Code Online (Sandbox Code Playgroud)

更新3:作为参考,这是我用来设置的命令.它们与问题中发布的略有不同,因为我--pyrex-gdb在运行setup.py时没有添加选项:

$ ls
cython_file.pyx  python_file.py  setup.py
$ cython --gdb cython_file.pyx 
$ python setup.py build_ext --inplace
Run Code Online (Sandbox Code Playgroud)

更新2:这是我cygdb使用你的文件的示例会话,首先我让python_file.py运行完成然后我设置断点并重新运行:

drew@ubuntu:~/stackoverflow/21033553-cython$ cygdb .

GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>.
Install pygments for colorized source code.
Python was not compiled with debug symbols (or it was stripped). 
Some functionality may not work (properly).
(gdb) cy run python_file.py
499500

(gdb) cy break cython_file.big_sum
Breakpoint 1 at 0x7ffff5db0270: file cython_file.c, line 435.
No frame is currently selected.
(gdb) cy run python_file.py
3    def big_sum():
(gdb) cy break :10
Breakpoint 2 at 0x7ffff5db02a6: file cython_file.c, line 468.
(gdb) cy cont
11        for i in range(1000):
(gdb) cy list
     6        for i in range(10000):
     7            a[i] = i
     8        # <==================== I want to put a break here
     9        cdef int my_sum
    10        my_sum = 0
>   11        for i in range(1000):
    12            my_sum += a[i]
    13        return my_sum
    14    
Run Code Online (Sandbox Code Playgroud)