Подтвердить что ты не робот

Отладка расширений Python

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

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;
}
4b9b3361

Ответ 1

Чтобы исходная отладка работала, ваши C-расширения должны быть построены с информацией об отладке (gcc -g). Поскольку вы управляете процессом компиляции с помощью distutils, вы можете указать флаги компилятора, используемые с помощью переменной среды CFLAGS (Установка Python Модули: Тонкая настройка флагов компилятора/компоновщика):

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

Обратите внимание, что даже если distutils по умолчанию имеет более высокий уровень оптимизации, чем -O0, вы действительно не должны получать этот символ No node "в текущей контекстной ошибке, пока - g, и большинство построений Python по умолчанию передают -g.

Ответ 2

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

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