2013-03-06 2 views
13

Я пытаюсь отлаживать модуль расширения для Python, который я написал в C. Я скомпилировал его, используя следующий:Python отладка расширения

python setup.py build -g install --user 

Я тогда отлаживать с:

gdb python 
... 
b py_node_make 
run test.py 

Это перерывы в py_node_make (одна из функций, я определил), но тогда я стараюсь:

(gdb) print node 
No symbol "node" in current context. 

функция Я пытаюсь отладки это:

static Python_node_t* py_node_make(
     node_t* node) 
{ 
    Python_node_t* pyNode; 

    pyNode = PyObject_New(Python_node_t, &t_node); 
    pyNode->node = node; 
    pyNode->borrowed = true; 

    return pyNode; 
} 

ответ

15

Для отладки источника для работы ваши C-расширения должны быть построены с информацией об отладке (gcc -g). Так как вы ведете процесс компиляции с distutils, вы можете указать флаги компилятора, используемые через CFLAGS переменное окружение (Installing Python Modules: Tweaking compiler/linker flags):

CFLAGS='-Wall -O0 -g' python setup.py build 

Обратите внимание, что даже если Distutils по умолчанию на более высокий уровень оптимизации, чем - O0, вы действительно не должны получить, что нет символа «узла» в текущей ошибки контекста, пока -g передается и большинство Python строит делать передать -g по умолчанию.

+0

Я считаю, что проблема была в том, что функция была полностью оптимизирована. Я знаю, флаг -g был установлен потому, что другие функции здесь и там и много информации, а не py_node_make. – CrazyCasta

+0

Я вижу. py_node_make() была небольшой статической функцией и главной целью для inlineing. Установка точки останова на нее все еще работала, но имя аргумента ** node ** теряется. – scottt

3

Проблема заключается в оптимизации. Я не уверен, как это сделать из командной строки, но в скрипте setup.py я только добавил extra_compile_args=['-O0'], в конструктор расширения, и все сработало.

По-прежнему хотел бы (и принимал) ответ, который связан с командной строкой arg (что-то после python setup.py build), которое выполнит то же самое, поэтому мне не нужно иметь конкретную строку для компилятора в файле setup.py.

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