I'm trying to figure out how to use cygdb to debug extensions built with python 
3. I've tested all the debugger commands listed in 
http://docs.cython.org/src/userguide/debugging.html 
<http://docs.cython.org/src/userguide/debugging.html> when debugging python 2 
extensions and everything works great. But some of the commands seem to be 
broken when debugging python 3 extensions.

Here are the debugger commands that I've confirmed as working with python 3 
extensions:

cy break
cy step
cy next
cy run
cy cont
cy down
cy finish .. works but prints error message
cy exec
cy list
cy_lineno()
cy_eval()
cy_cname()

Here are the commands which fail under python 3, and the error message that is 
given for each:

cy up
    Python Exception <class 'gdb.error'> There is no member named length.:
    Error occurred in Python command: There is no member named length.
cy finish .. works but gives error
    Python Exception <class 'gdb.error'> There is no member named length.:
    Error occurred in Python command: There is no member named length.
cy bt
    Python Exception <class 'gdb.error'> There is no member named length.:
    Error occurred in Python command: There is no member named length.
cy print
    Python Exception <class 'gdb.error'> There is no member named ma_mask.:
    Python Exception <class 'gdb.error'> Error occurred in Python command: 
There is no member named ma_mask.:
    Error occurred in Python command: Error occurred in Python command: There 
is no member named ma_mask.
cy set x = 2
    Python Exception <class 'gdb.error'> No symbol "__pyx_v_10helloworld_x" in 
current context.:
    Error occurred in Python command: No symbol "__pyx_v_10helloworld_x" in 
current context.
cy locals
    Python Exception <class 'gdb.error'> There is no member named ma_mask.:
    Error occurred in Python command: There is no member named ma_mask.
cy globals
    Python Exception <class 'gdb.error'> There is no member named ma_mask.:
    Error occurred in Python command: There is no member named ma_mask.
cy_cvalue()
    Python Exception <class 'gdb.error'> There is no member named ma_mask.:
    Error occurred in Python convenience function: There is no member named 
ma_mask.

In summary:
  - The "cy set" and "cy_cname()" commands seem to be giving incorrect C names 
for cython variables. I did a grep of the generated .c source file for 
"__pyx_v_10helloworld_x", and didn't get any hits. Luckily, the "cy exec" 
command works, so I can use that to get the value of variables as a workaround. 
  - Any commands related to viewing or traversing the call stack seem to give 
an error related to a missing "length" member. 
  - Commands related to printing the value of a variable complain about a 
missing "ma_mask" member. 

Here are the source files I used for the test:

helloworld.py:
import helloworld

helloworld.pyx:
x = 1
y = "a"
print("Hello World 1")
print("Hello World 2")
print("Hello World 3")
print("Hello World 4")
print("Hello World 5")
print("Hello World 6")
print("Hello World 8")
print("Hello World 9")
print("Hello World 10")

setup.py:
from distutils.core import setup
from Cython.Build import cythonize
from distutils.extension import Extension
extensions = [Extension("helloworld", ["helloworld.pyx"])]
setup(ext_modules=cythonize(extensions, gdb_debug=True, output_dir="."))

To compile I ran:
python setup.py build_ext --inplace

To debug, I ran:
cygdb -vv . -- --args python helloworld.py

Here is my python version:
Python 3.4.2

I used pyenv (https://github.com/yyuu/pyenv <https://github.com/yyuu/pyenv>) to 
build and install the latest Python 3 version with debugging symbols enabled.

Ben


_______________________________________________
cython-devel mailing list
cython-devel@python.org
https://mail.python.org/mailman/listinfo/cython-devel

Reply via email to