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

Как отлаживать C-расширения для Python в Windows

У меня проблема с segfault в pyobbc и хотелось бы отладить ее в Windows XP x86. Однако информация в Интернете кажется ориентированной на Linux. Каков наилучший способ сделать это?

4b9b3361

Ответ 1

Итак, я смог успешно решить свою проблему с помощью Visual Studio 2008. Я свободно следил за перечисленными здесь шагами -

http://www.velocityreviews.com/forums/t329214-debugging-python-extensions.html

И некоторые советы по обходным решениям здесь -

Компиляция модулей python с определением DEBUG на MSVC

Вот моя версия шагов для всех, кто может столкнуться с этой проблемой.

  • Если вы еще этого не сделали, не забудьте настроить каталоги заголовков Python и libs в VS

    а. Перейдите в раздел Инструменты > Параметры > Проекты и решения > Каталоги VС++. Не забудьте добавить свой путь include и libs к пути файлов Include и Library, соответственно. (например, C:\Python27\include, C:\Python27\libs)

  • Перейдите в свою папку включения Python (еще раз, например C:\Python27\include) и отредактируйте pyconfig.h. Прокомментируйте строку # define Py_DEBUG и сохраните. Перейдите в папку libs (например, C:\Python27\libs) и сделайте копию python27.lib. Назовите копию python27_d.lib.

  • Создайте новый проект. Выберите Проект Win32 и назовите его имя модуля (в моем случае pyodbc). Нажмите "Далее", затем выберите DLL для Тип приложения и отметьте Пустой проект.

  • В обозревателе решений щелкните правой кнопкой мыши заголовочные файлы и выберите "Добавить" > "Существующий элемент". Выберите все файлы заголовков, которые вам нужны. Сделайте то же самое для исходных файлов.

  • Перейдите в Проект > Свойства, затем в разделе Свойства конфигурации -

    а. Общие - убедитесь, что вы используете правильный набор символов. Для меня это было Use Multi-Byte Character Set. Возможно, для Python 3 требуется Use Unicode Character Set.

    б. Отладка - введите путь к Python в поле Команда. (например, C:\Python27\python.exe). Затем установите Прикрепить на Yes.

    с. Linker > General - измените Выходной файл на .pyd вместо .dll.

  • Убедитесь, что для вашей конфигурации установлено значение Отладка. Перейдите в Сборкa > Сборка решения.

  • Откройте cmd и cd в каталог, в котором был скомпилирован ваш файл pyd. Запустите python из окна cmd. Чтобы подключить отладчик в этом запущенном процессе python, вернитесь в Visual Studio и нажмите зеленую кнопку воспроизведения, чтобы начать отладку. Вы также можете использовать Debugging → Attach to Process... Теперь вернитесь на Python и импортируйте свой модуль. Играйте, тестируйте и пытайтесь сломать его!

Ответ 2

Отладка рабочего процесса с помощью WinDbg

Этот рабочий процесс создаст отладочную информацию для сборки Release, так что вы не нужно связываться с исходными файлами include и library на Python.

  • Загрузите и установите Инструменты отладки для Windows

  • Получить файлы символов для вашей версии Python и извлечь их. Для Python 2.7.3 это будет http://www.python.org/ftp/python/2.7.3/python-2.7.3-pdb.zip.

  • Измените setup.py для создания файлов отладки. Вы должны добавить '/Zi' в extra_compile_args и '/DEBUG' до extra_link_args. Пример:

    ext_modules  = [Extension('pyuv', sources=['src/pyuv.c'],
                              extra_compile_args=['/Zi'],
                              extra_link_args=['/DEBUG'])
                    ]
    
  • Стройте расширение как всегда (python setup.py ...).

  • Запустите WinDbg и укажите путь поиска символа (Ctrl + S).

    C:\Path\To\Extension_pdb
    C:\Path\To\Extracted\python-2.7.3-pdb
    srv*;SRV*c:\tmp*http://msdl.microsoft.com/download/symbols
    

    Последняя строка будет загружать и кэшировать необходимые символы для модулей Windows.

  • Запустите исполняемый файл Python (Ctrl + E). Вы можете напрямую выполнить script или запустить в интерактивном режиме.

  • Пропустить начальную точку останова с помощью "Go" (F5).

  • Если есть ошибка сегментации, выполнение прерывается, и вы будете увидеть что-то вроде нарушения доступа - код c0000005 (первый шанс) в консоли WinDbg.

  • Подробную информацию об исключениях можно получить, набрав !analyze -v в консоли WinDbg и текущей трассировке стека с помощью kb. Здесь пример такого вывода.

Вы должны уметь комбинировать этот подход с пиропадами answer для отладки с Visual Studio, если вы опустите свой второй шаг и построите проект с помощью Конфигурация выпуска.

Дополнительный учебник для WinDbg можно найти здесь.

Ответ 3

Segfaults особенно таинственны, так как нет никакого способа уловить их из вашего кода Python или даже получить много информации о стеке на стороне C вещей. Одна вещь, которая может дать вам хотя бы немного больше информации, - использовать библиотеку Google breakpad, чтобы сообщить о трассировке стека C, когда segfault имеет место.

Ответ 4

Вы можете попробовать инструмент David Malcolm CPyChecker, который статически анализирует C-расширения для утечек памяти и других ошибок. Инструмент задокументирован здесь.