17

I am trying to use cython debugger to put in a break point:

Here is my code:

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

I was following this guide:

This is what I did in the ubuntu shell:

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

Now I am inside the debugger, and I should be able to put in a break point, but when i try:

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

How should I set the break point correctly?

Update: I still have a problem even when I use setup.py provided by Drew McInnis:

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

I notice that I get this warning:

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

Could that be the problem?

I am using Cython version 0.19.1, Python 2.7.3, and ubuntu 12.10.

Akavall
  • 82,592
  • 51
  • 207
  • 251

1 Answers1

8

I believe you are setting the breakpoint correctly. The cython_file.so shared library created by cython isn't loaded by the interpreter until the module is imported. So the pending gdb breakpoint is fine as gdb will set this breakpoint when cython_file.so is dynamically loaded.

UPDATE 1: I did modify the setup.py slightly from what was posted. I based my setup.py on these cython debugging instructions... the main difference being the use of 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: For reference, here are the commands I used to get setup. They differ slightly from those posted in the question as I didn't add the --pyrex-gdb option when running setup.py:

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

UPDATE 2: Here is my sample cygdb session using your files, first I let python_file.py run to completion and then I set the breakpoint and re-ran:

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    
Drew MacInnis
  • 8,267
  • 1
  • 22
  • 18
  • Thank you for your post it helps, but when I run the exact thing your run, I don't get the same thing your get, I can't even get to cython_file (see my update). Also, it seems that you are stepping through big_sum from the very beginning, no starting from the break point. – Akavall Jan 19 '14 at 16:19
  • Updated with my setup.py and a gdb session where I run without breakpoints and then re-run with the breakpoint set. – Drew MacInnis Jan 19 '14 at 18:41
  • Updated the gdb session to show setting a break point on big_sum and then setting a second breakpoint on cython_file.pyx line 7 once the first breakpoint was hit. – Drew MacInnis Jan 19 '14 at 18:56
  • I couldn't set `cy break :8`, the closest I could get was line 11 at the start of the second for-loop. – Drew MacInnis Jan 19 '14 at 19:03
  • I still have the same problem, I re-updated my session. Are you running the first two lines (in my session) like I do? Do you run anything else? – Akavall Jan 19 '14 at 21:54
  • Updated my answer. I posted the commands I ran in my session. They are almost the same except the cython documentation I referenced didn't have the --pyrex-gdb option so I omitted it. I get the same `Unknown distribution option` warning. – Drew MacInnis Jan 20 '14 at 01:46
  • Not sure if it is relevant, but I am on an older version of cython: Python 2.7.3, Cython version 0.15.1, Ubuntu 12.04.4 LTS – Drew MacInnis Jan 20 '14 at 01:51
  • Hmm....Those are actually the same lines that I ran. So we have the same files, and we run the same commands, but we get different results? Can that really be our different Cython/Ubuntu versions? – Akavall Jan 20 '14 at 02:51
  • When I get to the 'cy list' part, it forgets about the cython code and starts debugging the C code – Chris Olivier Mar 09 '18 at 00:11
  • help, after `cy run python_file.py` i'm stuck in the programme instead of getting back to cygdb input – Dee Aug 31 '22 at 09:46
  • i need something similar to `cy start` but no such thing – Dee Aug 31 '22 at 10:14
  • my programme has a web server and it won't stop to type the second command `cy break` – Dee Aug 31 '22 at 10:30