gpt4 book ai didi

debugging - Cython调试,打断点

转载 作者:行者123 更新时间:2023-12-03 06:38:37 30 4
gpt4 key购买 nike

我正在尝试使用 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。

最佳答案

我相信您正确设置了断点。 cython_file.so 共享库在导入模块之前,解释器不会加载由 cython 创建的文件。因此,pending gdb 断点没问题,因为当 cython_file.so 时 gdb 会设置此断点动态加载。

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

更新 3:作为引用,以下是我用于进行设置的命令。它们与问题中发布的内容略有不同,因为我在运行 setup.py 时没有添加 --pyrex-gdb 选项:

$ ls
cython_file.pyx python_file.py setup.py
$ cython --gdb cython_file.pyx
$ python setup.py build_ext --inplace

更新2:这是我使用您的文件的示例cygdb session ,首先我让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

关于debugging - Cython调试,打断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21033553/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com