Отладка Приложений Php На Удаленном Хосте С Помощью Xdebug И Vim В Linux



Введение В PHP-приложениях отладка с использованием var_dump , debug_backtrace и другие полезные функции не всегда удобны и возникает необходимость в полноценном отладчике.

Эта статья для тех, кто по каким-то причинам не хочет использовать IDE, поддерживающие отладку PHP-приложений из коробки, вроде NetBeans или PhpStorm, а хочет использовать для этих целей vim, и отладка происходит на удаленном хосте.

Есть плагин для vim «DBGp-клиент» , но нормально отлаживать он позволяет только в том случае, если пути ко всем файлам на удаленной и локальной машинах совпадают. Например, если на вашем локальном компьютере у вас есть: /домашняя страница/пользователь/приложение/ /домашняя страница/пользователь/фреймворк/ а на удаленной машине они расположены в: /вар/www/html/приложение/ /вар/www/framework/ тогда отладить приложение с помощью «DBGp-клиента» будет невозможно, так как он ничего не знает о другом расположении исходников.

В этой статье мы рассмотрим:

  1. Вкратце — настройка всего необходимого для удаленной отладки приложения.

  2. Модификация плагина для поддержки разных путей.

  3. Кратко — с помощью отладчика.



Монтаж



Настройка vim на локальном хосте
Загрузите и установите плагин: $ компакт-диск ~/.

vim $wget www.vim.org/scripts/download_script.phpЭsrc_id=7285 -O отладчик.

zip $ распаковать debugger.zip $rm отладчик.

zip Внимание: vim должен быть собран с поддержкой Python, это можно проверить с помощью " :версия ", вывод должен содержать строку "+python".



Установите и настройте Xdebug на удаленном хосте.

Установите расширение Xdebug любым удобным для вас способом.

Например, в Debian Squeeze это делается просто: # apt-get установить php5-xdebug А вообще лучше прочитать официальная инструкция по установке .

Настройте подключение к локальному отладочному клиенту — для этого пропишите в php.ini следующие строки, заменив 192.168.1.110 на IP локальной машины (при необходимости порт также можно перенастроить): xdebug.remote_enable = 1 xdebug.remote_port = 9000 xdebug.remote_host = 192.168.1.110

Настройка сопоставления файлов
Идея проста — при отправке запроса к отладчику (например, на установку точки останова) мы должны преобразовать путь на локальном хосте в путь на удаленном хосте, и наоборот, при получении информации от отладчика ( например, что оно теперь находится в какой-то строке какого-то файла), мы должны сделать обратное преобразование.

Добавьте следующий код в конец файла debugger.py:

  
  
  
  
  
  
   

class FileMapping: def __init__(self, mapping_file): self.local_to_remote = {} self.remote_to_local = {} mapping = open(mapping_file, 'r') for line in mapping: local, remote = line.split(' ') local = local.strip() remote = remote.strip() if not (local in self.local_to_remote): self.local_to_remote[local] = [] self.local_to_remote[local].

append(remote) if not (remote in self.remote_to_local): self.remote_to_local[remote] = [] self.remote_to_local[remote].

append(local) def local_to_remote_file(self, local): for local_path in self.local_to_remote.keys(): if local.startswith(local_path): # use the first mapping as we don't know which one we should take remote_path = self.local_to_remote[local_path][0] return remote_path + local[len(local_path):] def remote_to_local_file(self, remote): for remote_path in self.remote_to_local.keys(): if remote.startswith(remote_path): for local_path in self.remote_to_local[remote_path]: local = local_path + remote[len(remote_path):] # use the first existing file if os.path.exists(local): return local return None file_mapping = FileMapping('/home/alexey/mapping')

И в файл картографирование ( /home/алексей/маппинг - замените на свой путь) пропишите соответствие между локальным и удаленным каталогом, например: /home/alexey/framework /var/www/framework /home/Алексей/приложение /var/www/html Просматриваем код плагина в поисках мест, откуда берутся имена файлов из Xdebug. В итоге все они сводятся к вызову одного метода — set_srcview, в начало которого мы добавляем изменение имени файла:

def set_srcview(self, file, line): """ set srcview windows to file:line and replace current sign """ file = file_mapping.remote_to_local_file(file)

Теперь ищем места, где наоборот имена файлов передаются из отладочного клиента в Xdebug. Таких мест два: 1. Класс отладчика, метод запуска, замена строки

'-t line -f ' + self.breakpt.getfile(bno) + ' -n ' + str(self.breakpt.getline(bno)) + ' -s enabled', \

на

'-t line -f ' + file_mapping.local_to_remote_file(self.breakpt.getfile(bno)) + ' -n ' + str(self.breakpt.getline(bno)) + ' -s enabled', \

2. Класс отладчика, метод mark, замените строку:

'-t line -f ' + self.breakpt.getfile(bno) + ' -n ' + str(self.breakpt.getline(bno)), \

на

'-t line -f ' + file_mapping.local_to_remote_file(self.breakpt.getfile(bno)) + ' -n ' + str(self.breakpt.getline(bno)), \

Уже исправленный debugger.py можно взять здесь .



Применение



Начнем отладку
Чтобы начать отладку веб-приложения, вам нужно запустить vim и нажать .

Далее в течение 5 секунд (ниже описано, как увеличить интервал) нужно запустить какой-нибудь PHP-скрипт, передав GET-переменную XDEBUG_SESSION_START со значением 1, например, просто открыв соответствующую страницу в браузере, например: webdev/debug.phpЭXDEBUG_SESSION_START=1 Альтернативно вы можете установить переменную в php.ini. xdebug.remote_autostart .

В этом случае при запуске любого PHP-скрипта Xdebug попытается подключиться к клиенту отладки.

Подробнее вы можете прочитать в официальная документация Xdebug .

Конечный результат должен быть примерно таким: должен открыться запущенный вами скрипт:

Отладка приложений PHP на удаленном хосте с помощью XDebug и vim в Linux

Окна справа – сверху вниз:

  1. ОКНО ПРОСМОТРА - контекст просмотра
  2. ОКНО ПОМОЩИ – краткое описание возможностей
  3. STACK WINDOW — стек вызовов функций.

  4. ОКНО СЛЕДОВАНИЯ — журнал связи между клиентом отладки и Xdebug, полезен для проверки, не работает ли отладка.



Кастомизация
Таймаут можно установить в том же скрипте, найдя строку в debugger.py:

serv.listen(5)

и заменив 5 на необходимое вам количество секунд. Комбинации клавиш задаются в debugger.vim, я например переназначил нажатием «,dr»: карта, доктор: Python debugger_run() Текст в ОКНЕ СПРАВКИ можно изменить в классе HelpWindow, методе on_create.

Навигация по коду
Я не буду вдаваться в подробности; отличия от других отладчиков минимальны:
  • Шаг в ( ) — шаг с входом внутрь функций.

  • Переступить ( ) — шаг, не заходя внутрь функций.

  • Выйти ( ) — выходит из функции вверх по стеку.

  • Бегать ( ) — продолжить выполнение до следующей точки останова.

  • Stack up (:Up) - переместить стек вверх (см.

    ОКНО СТЕКА).

  • Stack down (:Dn) - перемещение вниз по стеку (см.

    ОКНО СТЕКА).



Посмотреть текущий статус
  • Получение свойства ( ) — получить значение переменной (нужно поставить курсор на нужную переменную и нажать ).

  • Получить контекст ( ) — получить весь текущий контекст (грубо говоря, все доступные в этом контексте переменные).

  • Eval(,e) — выполнить произвольное выражение в текущем контексте и получить его значение.

На снимке экрана показано ОКНО ПРОСМОТРА с выполнением Context get и Eval:

Отладка приложений PHP на удаленном хосте с помощью XDebug и vim в Linux



Установка точек останова
Переключить точку останова (:Bp) — установить точку останова в текущей строке или удалить ее, если она уже существует. На скриншоте зеленая линия — это строка с точкой останова, красная — текущая строка:

Отладка приложений PHP на удаленном хосте с помощью XDebug и vim в Linux



Изменить размер
Кроме того, используя можно переключаться между двумя режимами - полным, когда справа отображаются различные вспомогательные окна, и простым - когда остается только окно с кодом.

Теги: #php #vim #xdebug #dbgp #php

Вместе с данным постом часто просматривают: