Введение В PHP-приложениях отладка с использованием var_dump , debug_backtrace и другие полезные функции не всегда удобны и возникает необходимость в полноценном отладчике.
Эта статья для тех, кто по каким-то причинам не хочет использовать IDE, поддерживающие отладку PHP-приложений из коробки, вроде NetBeans или PhpStorm, а хочет использовать для этих целей vim, и отладка происходит на удаленном хосте.
Есть плагин для vim «DBGp-клиент» , но нормально отлаживать он позволяет только в том случае, если пути ко всем файлам на удаленной и локальной машинах совпадают. Например, если на вашем локальном компьютере у вас есть: /домашняя страница/пользователь/приложение/ /домашняя страница/пользователь/фреймворк/ а на удаленной машине они расположены в: /вар/www/html/приложение/ /вар/www/framework/ тогда отладить приложение с помощью «DBGp-клиента» будет невозможно, так как он ничего не знает о другом расположении исходников.
В этой статье мы рассмотрим:
- Вкратце — настройка всего необходимого для удаленной отладки приложения.
- Модификация плагина для поддержки разных путей.
- Кратко — с помощью отладчика.
Монтаж
Настройка 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:
И в файл картографирование ( /home/алексей/маппинг - замените на свой путь) пропишите соответствие между локальным и удаленным каталогом, например: /home/alexey/framework /var/www/framework /home/Алексей/приложение /var/www/html Просматриваем код плагина в поисках мест, откуда берутся имена файлов из Xdebug. В итоге все они сводятся к вызову одного метода — set_srcview, в начало которого мы добавляем изменение имени файла: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')
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 .
Конечный результат должен быть примерно таким: должен открыться запущенный вами скрипт:
Окна справа – сверху вниз:
- ОКНО ПРОСМОТРА - контекст просмотра
- ОКНО ПОМОЩИ – краткое описание возможностей
- STACK WINDOW — стек вызовов функций.
- ОКНО СЛЕДОВАНИЯ — журнал связи между клиентом отладки и Xdebug, полезен для проверки, не работает ли отладка.
Кастомизация
Таймаут можно установить в том же скрипте, найдя строку в debugger.py: serv.listen(5)
и заменив 5 на необходимое вам количество секунд. Комбинации клавиш задаются в debugger.vim, я например переназначил нажатием «,dr»: карта, доктор: Python debugger_run() Текст в ОКНЕ СПРАВКИ можно изменить в классе HelpWindow, методе on_create.
Навигация по коду
Я не буду вдаваться в подробности; отличия от других отладчиков минимальны:- Шаг в ( ) — шаг с входом внутрь функций.
- Переступить ( ) — шаг, не заходя внутрь функций.
- Выйти ( ) — выходит из функции вверх по стеку.
- Бегать ( ) — продолжить выполнение до следующей точки останова.
- Stack up (:Up) - переместить стек вверх (см.
ОКНО СТЕКА).
- Stack down (:Dn) - перемещение вниз по стеку (см.
ОКНО СТЕКА).
Посмотреть текущий статус
- Получение свойства ( ) — получить значение переменной (нужно поставить курсор на нужную переменную и нажать ).
- Получить контекст ( ) — получить весь текущий контекст (грубо говоря, все доступные в этом контексте переменные).
- Eval(,e) — выполнить произвольное выражение в текущем контексте и получить его значение.
Установка точек останова
Переключить точку останова (:Bp) — установить точку останова в текущей строке или удалить ее, если она уже существует. На скриншоте зеленая линия — это строка с точкой останова, красная — текущая строка:Изменить размер
Кроме того, используя можно переключаться между двумя режимами - полным, когда справа отображаются различные вспомогательные окна, и простым - когда остается только окно с кодом.Теги: #php #vim #xdebug #dbgp #php
-
Что Такое Процессор И Что Он Делает?
19 Oct, 24 -
Разница Между Веб-Дизайном И Веб-Хостингом
19 Oct, 24 -
Альтернатива Интернет-Ссылкам В Сми
19 Oct, 24 -
Ты Не Мудак, Пользователь?
19 Oct, 24