[spoiler]
Изначально сделал скрипт, который работает с xdebug по протоколу
Затем, работая с
0.0267 5045464 -> getLocalPath('templates/books', '/bitrix') /home/denis/www/dev/bitrix/modules/main/include.php:465 0.0267 5045580 -> rtrim('/home/denis/www/dev', '\\/') /home/denis/www/dev/bitrix/modules/main/tools.php:5900 >=> '/home/denis/www/dev' => $root = '/home/denis/www/dev' /home/denis/www/dev/bitrix/modules/main/tools.php:5900 0.0267 5045708 -> file_exists('/home/denis/www/dev/local/templates/books') /home/denis/www/dev/bitrix/modules/main/tools.php:5902 >=> FALSE 0.0267 5045708 -> file_exists('/home/denis/www/dev/bitrix/templates/books') /home/denis/www/dev/bitrix/modules/main/tools.php:5906 >=> TRUE >=> '/bitrix/templates/books' 0.0268 5045440 -> define('SITE_TEMPLATE_PATH', '/bitrix/templates/books') /home/denis/www/dev/bitrix/modules/main/include.php:465 |
Сначала это был простой скрипт, а теперь модуль
Отладчик
Что мы видим при открытии трейса:
Сверху кнопки навигации по файлу трейса:
Начало - переход к первой записи в файле,
Шаг влево - переход на строчку вверх в трейсе (на предыдущий вызов функции - этой возможности в дебаггерах нет т.к. программы не умеют выполняться назад),
Шаг вниз - на одну запись в трейсе, на следующий вызов функции или определение переменной (если информация о присвоении переменных есть в трейсе, параметр xdebug.collect_assignments)
Шаг вправо - переход далее не заходя внутрь функции,
Шаг вверх - выйти из текущей функции и перейти к следующему шагу.
После включения опции "отображать результат выполнения функций" вы увидите возвращаемые значения после вызова функции (если была включена опция xdebug.collect_return при отладке). Имейте ввиду, что информацию об этом в файле трейса появляется после отработки всех вложенных функций, что может потребовать времени на поиск.
Есть полезная особенность навигации: все запросы идут через ajax, но текущая позиция сохраняется в адресной строке в виде якоря, это значит, что вы можете всегда нажать F5 и оказаться на том же месте.
Поиск в трейсе:
Все опции ищут с учетом регистра по подстроке и работают по условию "логическое И". К адресу файла можно дописать номер строки после двоеточия для перехода на конкретную строку.
В исходном коде все номера строк кликабельные:
Затем нажимаем "далее" и переходим к помеченной строке.
Для построения текущей картинки не используется предобработка (трейс строится в момент хита), что позволяет перейти в любое место трейса:
Индикация положения времени помогает при отладке проблем производительности (время не кликабельно, это потребовало бы поиска по всему файлу).
Стек функций тоже строится на лету, для этого необходимо прочитать трейс выше текущей позиции. Обратите внимание, что часть функций может отображаться вопросами, это значит, что они находятся выше в трейсе:
В настройках модуля можно изменить размер буфера чтения, по умолчанию стоит 100 Кб, что очень быстро, 1 Мб - приемлемо, 10 Мб и более уже ощущаются заметные тормоза.
Все вызовы функций в стеке кликабельны, позволяют перейти к месту их вызова.
В исходном файле текущая строка подсвечивается, прошлая строка меняет цвет на бледный.
Если вы загрузили себе трейс, полученный на другом сайте, и исходный код недоступен, все прелести отладки остаются доступны, а вместо исходного кода отображается нужный фрагмент трейса:
Модуль имеет настройки:
Можно по своему правилу на PHP можно включить отладку на определенное время. Дело в том, что модуль регистрируется на событие
Для большего удобства сделана поддержка специальной cookie и ссылки для неё. Перетащите ссылку на панель закладок и получите возможность включать/выключать сбор отладки для текущего сайта:
По отладке всё, помимо этого есть ещё интересный функционал: профилировщик.
Но об этом я хочу рассказать в
Включение xdebug на виртуальной машине Битрикс
На нашей виртуальной машине xdebug поставляется с первых версий. Для включения модуля надо просто раскомментировать его подключение в /etc/php.d/xdebug.ini
Войдите под пользователем root, выполните:
mv /etc/php.d/xdebug.ini.disabled /etc/php.d/xdebug.ini |
в редакторе и замените:
; zend_extension=/usr/lib/php/modules/xdebug.so |
zend_extension=/usr/lib/php/modules/xdebug.so |
Затем перезапустите Apache:
/etc/init.d/httpd restart |
Надеюсь, новый модуль сильно облегчит жизнь разработчикам под Битрикс.
Фото:
Вопрос только, как настраивать модуль на продакшене, чтобы xDebug работал только у меня и не тормозил у всех?
Модуль может быть загружен в память на продакшене, сам по себе он не существенно влияет на производительность (хотя влияние есть). В режиме сбора трейсов, конечно, работает, понятно, медленно. Для этого сделал включение отладки по условию.
Я включил на VMBitrix php-модуль xDebug и у меня сайты стали работать медленнее.
Без xDebug
С установленным xDebug:
Я даже ваш модуль для Битрикса не устанавливал.
Как на виртуальной машине настроить модуль PHP xDebug так, чтобы я мог запустить отладку, а у других пользователей сервер работал нормально.
Пытался в z_bx_custom.ini прописать xdebug.default_enable = 0 - не помогло, ускорения не заметил. Естественно, по умолчанию было xdebug.profiler_enable = 0.
Мой вопрос такой: какие оптимальные настойки для модуля PHP xDebug следует сделать на виртуальной машине Битрикса, чтобы такое можно было бы включать на продакшене.
Это значит, что вам надо подключить модуль на период отладки.
Почему бы не сделать папку трейсов по умолчанию где-нибудь в папке сайта.
Сейчас получается папка трейсов /tmp общая для всех сайтов и пользователей. При этом в папке /tmp уже много файлов.
На VMBitrix пока указал /home/bitrix/xdebug
Всё место не должно забиться, ведь вы же не делаете трейс на каждый хит, только вручную для отладки. Удалять файлы можно из списка выбора файла.
Когда открываю папку /tmp на VMBitrix - там уже очень много файлов, кроме трейсов. Очень неудобно работать с модулем.
Спасибо за модуль.
Надеюсь что понравится всем разработчикам нашей компании.
В файле /etc/php.ini поставил код
xdebug.collect_params=3
xdebug.trace_output_name=trace.%s.%R.%r.xt
xdebug.trace_output_dir=/home/bitrix/xdebug
xdebug.auto_trace = 1
Перезагрузил машину, но отладчик все равно не работает, как настраивать правильно ?
Пожалуйста, сделайте константу или глобальную переменную, чтобы я мог ее установить в начале страницы и трейс бы стал записываться.
Можно будет в партнерских модулях применять.
тут только SESSION не хватает.
И подумать как переменные лучше отобразить:
В одну строчку как-то сурово. Есть смысл, если возможно, при клике новое окно открыть, в котором выводится значение.
Подумаю, как лучше сделать, когда снова доберусь до этого вопроса.
Если надо сделать трейс конкретной страницы, наверно проще сразу вставить xdebug_start_trace().
А если определить её на постоянной основе, будут получаться трейсы - надо, не надо.
Опишите, пожалуйста, предполагаемый сценарий использования.
Там есть возможность писать события обмена в лог-файл и отправлять в Живой лог.
Была идея сделать еще сделать флажок "Включить сбор трейсов xDebug". Не хочу возиться с настройками для xDebug в своем модуле. Вашим модулем смотреть трейсы гораздо удобнее. И опций достаточно. Что сохранять, и куда сохранять.
Поэтому и предлагал сделать константу.
Вопрос:
Правильно я понимаю, что сейчас я могу сделать xdebug_start_trace(), но только после вашего события. И все опции из настроек bitrix.xdebug применятся?
Сделать можно, но проще использовать событие модуля bitrix.xdebug в своём коде:
Варианты:
- отключить этот тип ошибок (E_STRICT),
- создавать объект:
У нас битрикс стоит на сервере alt linux 7.0
Попытались установить файл Файл XDEBUG.SO сюда /usr/lib/php/modules но эта библиотека нормально не подгружается. Выходит сообщение:Failed loading /usr/lib64/php/5.3.25/extensions/xdebug.so: /usr/lib64/php/5.3.25/extensions/xdebug.so: wrong ELF class: ELFCLASS32
Можете рассказать как устанавливать xdebug на сервер alt linux 7.0?
xdebug установлен
PHP Version 5.3.28
А вот сами файлы (trace.1410422034.xt) есть во временной папке, на вид рабочие.
Почему такое может быть? Как открыть профилирование?
оно неубираемо.