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

时间:2014-01-09 23:42:56

标签: 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

python_file.py

from cython_file import big_sum

result = big_sum()
print result

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"])]
)

我关注此guide

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

cython --gdb cython_file.pyx
python setup.py build_ext --inplace
cygdb

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

(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.

我应该如何正确设置断点?

更新:即使我使用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

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

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

这可能是问题吗?

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

1 个答案:

答案 0 :(得分:5)

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

更新1 :我确实从发布的内容略微修改了setup.py。我将cythonize基于这些cython debugging instructions ......主要区别在于使用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) )

<强> setup.py

--pyrex-gdb

更新3 :作为参考,以下是我用于设置的命令。它们与问题中发布的略有不同,因为我在运行setup.py时没有添加$ ls cython_file.pyx python_file.py setup.py $ cython --gdb cython_file.pyx $ python setup.py build_ext --inplace 选项:

cygdb

更新2 :以下是使用您的文件的示例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 运行完成,然后设置断点并重新运行:< / p>

{{1}}