
Введение
Разработчики любых программных продуктов тратят на устранение неполадок в собственных приложениях относительно большое количество времени. Поиск некоторых, особо назойливых “жучков”, способен вогнать любого программиста в тоску. Как оптимизировать этот процесс? Сходу писать на 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>
Заключение
Стоит отметить, что данный отладчик все же имеет определенные ограничения. Скажем он не умеет обрабатывать контрольные точки глубоко в подключаемых модулях. Те не менее, он достаточно полезен. Интересно например своими глазами посмотреть алгоритм работы любимого фреймворка :)