Xdebug и VIM
Доброе время суток участники образовательной IT площадки GeekSpace. Меня зовут Юрий Сиротенко и сегодня в данном конспекте мы поговорим о средстве профилирования и отладки PHP скриптов Xdebug в рамках свободного текстового редактора VIM
Настоящий конспект можно в полной мере считать практическим, так как на нем я не буду объяснять что такое Xdebug и VIM, а лишь покажу как использовать ранее упомянутый отладчик в оговоренном редакторе.
В данном конспекте я не буду рассказывать о том как установить и сконфигурировать Xdebug и VIM, предполагается, что слушатель предварительно установил нужный набор инструментов и хочет научиться использовать отладчик в текстовом редакторе VIM.
Сразу хотелось бы сказать что для взаимодействия Xdebug с VIM мы не будем писать свое собственное расширение, а воспользуемся уже существующим Open Source плагином
В конце конспекта вы сможете получить методическое пособие, презентацию, а также дополнительные материалы к изучению касающиеся данной темы. Давайте пожалуй приступим!
Введение
Как было сказано ранее, для взаимодействия Xdebug с текстовым редактором VIM будет использовано Open Source расширение имя которого “DBGp-Remote-Debugger-Interface”
Установка
Для начала давайте склонируем расширение для VIM
git clone https://github.com/vim-scripts/DBGp-Remote-Debugger-Interface.git
Затем в корневой директории пользователя найдем папку “.vim” и создадим в ней директорию “plugin”
mkdir ~/.vim/plugin
Переместим все файлы плагина в ранее созданную директорию
cp -R DBGp-Remote-Debugger-Interface/plugin/* ~/.vim/plugin/
Готово. Плагин успешно установлен.
Конфигурирование
Хотя расширение и готово к работе давайте переопределим глобальную переменную отвечающую за порт, на который завязан xdebug. Перейдем в конфигурационный файл “.vimrc”, который находится в корневой директории пользователя. Если данного файла не существует - необходимо создать его. Добавим туда следующую директиву.
let g:debuggerPort = 9001
Я поставил значение 9001 дабы избежать конфликта портов. Как правило порт используемый XdebugОм по умолчанию - это 9000 и он уже используется PHP-FPM.
Раз мы уже затронули тему конфигурирования плагина, давайте еще немного перенастроим плагин
Откроем файл `~/.vim/plugin/debugger.vim` в текстовом редакторе
vim ~/.vim/plugin/debugger.vim
По умолчанию Xdebug расширение для VIM настроено таким образом, что время ожидания сокета составляет 5 секунд, иначе говоря интервал ответа между шагами должен составлять не более 5 секунд. Если PHP скрипт не ответит в рамках этого времени, то отладчик прекратит свою работу.
В моей практике я встречаю некоторые скрипты, которые могут выполняться более 5 секунд. Порой это такие скрипты, которые синхронно ожидают ответа от внешних сервисов. Именно для таких случаев существует директива “debuggerTimeout”. Давайте прочитаем комментарий
to set the socket waiting time before timeout(default 5 second) use :
let g:debuggerTimeout = 10
above snippet use 10 second
Вернемся в конфигурационный файл нашего редактора и переопределим данную директиву. Выставим значение в 30 секунд
let g:debuggerTimeout = 30
Также в работе мне приходится отлаживать скрипты где фигурирует большая вложенность структуры данных массив. Но дело в том, что по умолчанию движок отладчика может возвращать вложенность равную одному, что крайне не удобно
Благодаря директиве “debuggerMaxDepth” мы можем скорректировать это значение. Комментарий звучит следующим образом
g:debuggerMaxDepth (default 1): The maximum depth that the debugger engine may return when sending arrays, hashs or object structures to the IDE.
Снова вернемся в конфигурационный файл VIM и переопределим эту опцию
let g:debuggerMaxDepth = 10
Эксплуатация
Теперь мы можем приступать к формированию простенького PHP скрипта который складывает два числа дабы проверить работоспособность отладчика
<?php
// example.php
$x = 1;
$y = 2;
$res = $x + $y;
echo "$res\n";
Переведем курсор на восьмую линию и поставим break point при помощи команды
:Bp
Как видим строка была подсвечена зеленым цветом. Теперь необходимо нажать функциональную клавишу “F5”. В результате отобразится следующее сообщение
waiting for a new connection on port 9001 for 10 seconds…
Xdebug был запущен и ожидает соединения. Давайте запустим скрипт при помощи терминала в отдельной вкладке
php example.php
Теперь вернемся в редактор VIM и увидим следующее уведомление о том, что соединение было получено от машины с ip адресом 127.0.0.1
connection from ('127.0.0.1', <id>)
Press ENTER or type command to continue
Для того чтобы начать дебаг нужно нажать клавишу ENTER.
Отладка нашего мини приложения началась. Теперь мы можем отслеживать выполнение программы поэтапно, то есть в рантайме. Давайте более подробнее остановимся на рабочей области отладчика
- Отладочная рабочая область была сформирована плагином в новой вкладке. Когда отладка будет завершена, вкладка автоматически закроется.
- Текущий отладочный шаг подсвечивается красным цветом, а с краю слева можно увидеть символ “->”
- Точка останова подсвечивается зеленым цветом, а с краю слева можно увидеть символ “B>”
- Верхнее правое окно отображает отладочную информацию, например содержимое переменных
- Среднее окно справа является своего рода памяткой со списком команд для осуществления отладки программы
- Нижнее окно справа отображает маршрут выполнения программы
Для того чтобы перейти к следующему шагу отладки нужно нажать клавишу “F3”
Как видим мы шагнули на 6 строку. Чтобы осуществить прыжок сразу на точку останова избежав промежуточные этапы, необходимо нажать клавишу “F4”
Снова нажмем “F3” чтобы перейти к следующему шагу отладки
Чтобы узнать, какое значение в данный момент находится в переменной “$res”, переведем курсор на переменную “$res” и нажмем функциональную клавишу “F12”
В окне “WATCH_WINDOW” запишется информация о значении переменной “$res”
Xdebug автоматически закончит отладку когда вы дойдете до конца скрипта. Если возникнет необходимость прекратить отладку принудительно, необходимо нажать клавишу “F6”
Заключение
В своей профессиональной практике я использую текстовый редактор VIM и практический каждый день произвожу отладку программ при помощи Xdebug.
За бортом данного конспекта остались еще ряд функциональных возможностей данного плагина, например такая фича как переход внутрь методов и функций.
Дополнительные материалы
- https://www.vim.org/
- https://en.wikipedia.org/wiki/Vim_(text_editor)
- https://xdebug.org/
- https://en.wikipedia.org/wiki/Xdebug
- https://github.com/vim-scripts/DBGp-Remote-Debugger-Interface