Search
Write a publication
Pull to refresh

Отладка PHP приложений: XDebug + Vim

Введение


Разработчики любых программных продуктов тратят на устранение неполадок в собственных приложениях относительно большое количество времени. Поиск некоторых, особо назойливых “жучков”, способен вогнать любого программиста в тоску. Как оптимизировать этот процесс? Сходу писать на 100% стабильный код? К сожалению такой таблетки еще не придумали :(


И тут нам на помощь приходят всевозможные debugger-ы (отладчики). Многие платформы, имеют встроенные средства пошаговой отладки кода. Вместе с тем, PHP “из коробки” этим обделен. Но не стоит унывать раньше времени! В этой заметке я хочу показать: как, достаточно легко, используя подручные средства, собрать среду для отладки ваших скриптов.


Хочется отметить, что моя заметка основывается на англоязычной статье, комментариям к ней и собственной практике. И несмотря на наличие хорошей англоязычной документации, думаю данный материал будет полезен русско-говорящему сообществу веб-программистов, особенно тем, кто только начинает свой путь.


Вот как это выглядит


Вы программируете в редакторе Vim. Нажимаете клавишу F5, Vim переходит в режим ожидания соединения от сервера приложений. Вы обновляете PHP страницу, над кодом которой идет работа и сервер создает соединение с Vim. Прямо в редакторе создается окружение для отладки кода. Вы можете пошагово перемещаться по нему, заходя внутрь пользовательских функций и возвращаясь обратно. Также вы можете налету выполнять (eval) собственные выражения, получать сведения о текущем контексте (состоянии всех видимых переменных), устанавливать и убирать контрольные точки, менять свойства объектов и переменные и т.п. (см рисунок 1)



Рисунок 1. Как выглядит отладка в Vim + Xdebug


Инструкция по настройке


Для того, чтобы настроить подобное чудо инженерной мысли у себя на сервере (рабочей машине) вам понадобится Vim c включенными функциональными модулями python, sign и специальным плагином, а также расширение для PHP – Xdebug.


Vim: необходимые модули


Проверить наличие всех нужных модулей можно запустив Vim и набрав :version. Если вы видите строки +python и +sign, все необходимое у вас установлено, пропустите следующие пару абзацев и перейдите к установке специального плагина для отладки в Vim.


В противном случае у вас два выхода, либо скачать необходимый пакет из репозитория, для Ubuntu команда такая (попробуйте поискать данный пакет в своем дистрибутиве Linux):


apt-get install vim-python

Или же скачайте исходники Vim, распакуйте архив. Затем перейдя в директорию приложения, выполните:


CFLAGS=”-D FEAT_SIGNS” ./configure –enable-pythoninterp

Далее:


make и make install

Vim: установка плагина debugger


Так или иначе у вас должны появится означенные ранее модули, теперь же скачаем архив с плагином debugger для Vim. Распакуем его и поместим два полученных файла (debugger.vim и debugger.py) в специальную директорию, предназначенную в Vim для хранения плагинов. Это может быть ~/.vim/plugin или же /usr/share/vim/vim71/plugin – зависит от ситуации в каждом конкретном случае. После этого запускаем Vim чтобы убедиться что никаких ошибок наши действия не вызвали.


На данном этапе клиент для отладки готов. Перейдем к настройке серверной части.


PHP модуль Xdebug


Установка этого PHP расширения также возможна несколькими способами. Я пошел по простейшему пути и в своей Ubuntu Hardy (попробуйте поискать данный пакет в своем дистрибутиве Linux) выполнил команду:


apt-get install php5-xdebug

Также можно скачать и скомпилировать исходники с официального сайта проекта.


Убедитесь (это видно при анализе конфигурационного файла), что Xdebug собран как zend_extension, а не просто extension. Наш отладчик может быть настроен только в первом варианте. Именно поэтому установка через Pecl нас не устроит. Xотя для работы этого расширения в целом способ включения в PHP не имеет значения.


Проверьте опции модуля в php.ini или в отдельном файле модуля, скажем в /etc/php5/conf.d/xdebug.ini. Cекция должна выглядеть примерно так:


zend_extension = /full/path/to/xdebug.so
xdebug.remote_enable = 1
# порт, через который будем писать информацию
xdebug.remote_port = 9000
# хост, на который писать информацию
xdebug.remote_host = localhost

В случае, если с сервером работает сразу несколько разработчиков, то нужно указать свой порт для каждого из них. Легче всего это седлать, если работа организованна посредством виртуальных серверов (VirtualHost). Тогда в конфигурации каждого из них установите собственные значения для (xdebug.remote_port):


php_value xdebug.remote_port 9001

Но это еще не все, потребуется также настроить Vim на работу с этим портом. Пропишите этот порт в своем Vim-профайле, например в .vimrc:


let g:debuggerPort = 9001

Перезагрузите Apache и на страничке phpinfo(), а я надеюсь такой скрипт у вас под рукой имеется, убедитесь в правильности конфигурирования (см. Рисунок 2).



Рисунок 2. Информация о модуле Xdebug

Использование


Теперь, если ваш отладочный сервер находится по адресу webdev, перейдите к необходимому скрипту таким образом:


http;//webdev/example.php?XDEBUG_SESSION_START=smth

Передача этого параметра установит в браузере специальную куку (cookie) сроком на 1 час. А она в свою очередь будет заставлять PHP Xdebug модуль пытаться установить соединение с отладочным клиентом (Vim) на порту 9000. Если по какой то причине соединение установить не удалось, скрипт продолжит работу в обычном режиме и страница загрузится.


Возвращаемся обратно в Vim, при этом можно даже не открывать определенного файла, а просто запустить редактор. Нажимаем F5. Тут вы должны увидеть сообщение “waiting for a new connection on port 9000 for 5 seconds…” внизу экрана.


У вас есть 5 секунд, чтобы обновить страницу в браузере и тем самым установить соединение между отладчиком и клиентом. Теперь вы можете приступить к пошаговому разбору кода, следуя инструкциям.


Горячие клавиши


  • F1 – скрыть служебные поля, освобождая рабочую область отладчика для кода, повторное нажатие раскроет все вкладки
  • F2 – шаг вперед с заходом в пользовательскую функцию
  • F3 – перешагнуть через пользовательскую функцию
  • F4 – вывести отладку из текущей пользовательской функции
  • F5 – запустить отладку (повторное нажатие приведет к переходу к контрольной точки, либо к концу скрипта)
  • F6 – закончить отладку и выйти
  • F11 – показать контекст (значение всех переменных в области видимости)
  • F12 – установив курсор на переменную и нажав эту клавишу, вы получите на экран значение этой переменной
  • ,e – выполнение (eval) собственного кода во время отладки
  • :Bp – установить/снять контрольную точку в той строке, на которой стоит курсор

Что делать, если одна из предустановленных горячих клавиш уже занята другим приложением? Откройте файл debugger.vim, найдите строки 130-152, они как раз отвечают за привязку клавиш к функциям отладчика. Например, чтобы заменить привязку “F11” на “l” нужно строку:


map <F11> :python debugger_watch_input ("context_get") <cr>A<cr>

заменить на:


map l :python debugger_watch_input ("context_get") <cr>A<cr>

Заключение


Стоит отметить, что данный отладчик все же имеет определенные ограничения. Скажем он не умеет обрабатывать контрольные точки глубоко в подключаемых модулях. Те не менее, он достаточно полезен. Интересно например своими глазами посмотреть алгоритм работы любимого фреймворка :)

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.