2014-01-09 3 views
10

Я пытаюсь использовать 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 

Теперь я нахожусь внутри отладчика, и я должен быть в состоянии поставить точку останова, но когда i попробуйте:

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

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

Update: Я до сих пор есть проблемы, даже когда я использую setup.py предоставленный Дрю McInnis:

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

ответ

4

Я считаю, что вы правильно установили точку останова. Общая библиотека cython_file.so , созданная cython, не загружается интерпретатором, пока модуль не будет импортирован. Таким образом, в ожидании точки останова gdb в порядке, так как gdb установит эту точку останова, когда cython_file.so будет динамически загружен.

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

UPDATE 3: Для справки, вот команды, которые я раньше получить настройку. Они немного отличаются от опубликованных в вопросе, поскольку я не добавлял параметр --pyrex-gdb при запуске установки.ру:

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

UPDATE 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  
+0

Спасибо для вашего сообщения это помогает, но когда я запускаю точный результат вашего запуска, я не получаю то же самое, что и вы, я даже не могу попасть в cython_file (см. мое обновление). Кроме того, кажется, что вы переходите через big_sum с самого начала, начиная от точки останова. – Akavall

+0

Обновлен с помощью моей setup.py и сеанса gdb, где я запускаю без контрольных точек, а затем повторно запускаю с помощью набора точек останова. –

+0

Обновлен сеанс gdb, чтобы показать настройку точки останова на big_sum, а затем установить вторую точку останова на строке cython_file.pyx 7 после первой точки останова. –

Смежные вопросы