Отладка Cython, точка разрыва - программирование
Подтвердить что ты не робот

Отладка 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:

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.

Как правильно установить точку прерывания?

Обновление. У меня все еще проблема, даже когда я использую setup.py, предоставленный Дрю Макиннисом:

[email protected]:~/PythonStuff/CythonStuff/cython_debug_2$ cython --gdb cython_file.pyx
[email protected]:~/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
[email protected]:~/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

Я замечаю, что получаю это предупреждение:

[email protected]:~/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.

4b9b3361

Ответ 1

Я считаю, что вы правильно устанавливаете точку останова. Общая библиотека 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)
)

ОБНОВЛЕНИЕ 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

ОБНОВЛЕНИЕ 2. Вот мой пример cygdb сеанса с использованием ваших файлов, сначала я пропустил python_file.py для завершения, а затем установил точку останова и запустил:

[email protected]:~/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