Установка и настройка отладчика Xdebug

Главные вкладки

Аватар пользователя VladSavitsky VladSavitsky 6 декабря 2008 в 19:56

Отладчик XdebugДля отладки и трассировки кода нужно установить и настроить Xdebug.

Страница проекта: http://www.xdebug.org/

Описание

Xdebug вмешивается в процесс для предотвращения бесконечных рекурсий, добавляет в сообщения об ошибках информацию о трассировке стека и функций, следит за распределением памяти, а также выполняет некоторые другие функции. Xdebug содержит также набор функций, которые вы можете добавить в свой код для получения диагностических данных времени выполнения.

Установка Xdebug

Этот пакет входит во многие дистрибутивы Линукс и его можно легко установить.
См. также "Пример компиляции Xdebug в Linux/Unix".

Проверка установки

Для проверки корректности установки и разрешения работы расширению Xdebug перезапустите ваш Web-сервер, затем создайте простое однострочное PHP-приложение с кодом


<?php phpinfo(); ?>

Если вы укажете адрес файла в браузере (например, http://localhost/phpinfo.php) и прокрутите выведенную информацию вниз, то увидите раздел Xdebug.

Если этого раздела нет в phpinfo(), то Xdebug не загрузился.

Причины неправильной установки

log-файлы ошибок вашего сервера Apache могут указать причину. К обычным ошибкам относится:

  • неправильный путь для zend_extension,
  • конфликт с другим расширением. Например, если вы хотите использовать XCache и Xdebug, первым загружайте XCache. Однако, поскольку Xdebug предназначен для использования во время разработки и предполагая, что путь к xdebug.so указан правильно, запретите другие расширения и попробуйте еще раз. Затем можно повторно разрешить расширения для выполнения других проверок, например, эффективности кэширования.

На сайте Xdebug приведены также некоторые другие советы по решению возможных проблем.

Все важные настройки для Xdebug в файле php.ini

При возникновении ошибок нужно ответить на четыре вопроса. Xdebug может предоставить всю нужную информацию, причем немедленно. Вот для начала несколько полезных настроек.

Сохраните эти настройки в файле php.ini, а затем перезапустите ваш Web-сервер:

zend_extension = /usr/lib/php4/20020429/xdebug.so
xdebug.default_enable = On

; разрешает трассировку исключительных ситуаций, даже
; если вы перехватили исключительную ситуацию:
xdebug.show_exception_trace = On

; выводит все локальные переменные самой внешней области видимости
; каждого вызова функции, включая еще не инициализированные переменные:
xdebug.show_local_vars = 1

;ограничение глубины рекурсии:
xdebug.max_nesting_level = 50

; указывает глубину вывода комплексной переменной:
xdebug.var_display_max_depth = 6

; управляют тем, какие суперглобальные переменные PHP
; включаются во все диагностические результаты
xdebug.dump_once = On
xdebug.dump_undefined = On
xdebug.dump.REQUEST = *
xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT

; для вывода суперглобальных переменных, перечисленных
; в настройках xdebug.dump.SUPERGLOBAL:
xdebug.dump_globals = On

Подробности настройки: http://www.ibm.com/developerworks/ru/library/os-php-xdebug/index.html#co...

Отладка массивов и классов PHP

Xdebug предоставляет расширенную функцию var_dump(), которая особенно полезна для массивов и классов PHP. Например, в листинге 6 приведен простой (PHP V4) класс и экземпляры.

Трассировка кода

При разрешенной трассировке Xdebug регистрирует каждый вызов функций, включая аргументы функции и возвращаемое значение. Можно отформатировать каждый log-файл для более удобного его восприятия человеком или машиной. Первый вариант вы можете просматривать сами, а для второго можно написать отдельное приложение для анализа.
Продолжение на DrupalCookBook...

Комментарии

Аватар пользователя Gildor Gildor 7 декабря 2008 в 8:16

"<a href="mailto:shamaner@drupal.org">shamaner@drupal.org</a>" wrote:
devel смотрели? а как насчет krumo?

Вы о чем?)
Xdebug - полнофункциональный отладчик серьезных php приложений.

devel - просто отладка вывода встроенных друпаловских функций.
krumo - а это вообще просто красивый вывод для var_dump();

Аватар пользователя Artem Beloglazov Artem Beloglazov 7 декабря 2008 в 11:38

«А под windows?»
Без проблем.
На хабре эта тема(xdebug) красочно раскрыта, в том числе и установка под винду:
http://www.habrahabr.ru/blog/webdev/9822.html - Часть 1ая
http://www.habrahabr.ru/blog/webdev/9906.html - Часть 2ая
http://habrahabr.ru/blog/php/37002.html - еще
http://habrahabr.ru/blogs/php/31468/ - и еще)

Аватар пользователя Artem Beloglazov Artem Beloglazov 9 декабря 2008 в 12:27

открыл для себя ядерную фичу) при профилировании с xdebug+kcachegrind.
Вообщем нужно запустить дебаггер и остановить на первой строке, потом одновременно загрузить в kcachegrind файл, куда xdebug постепенно сливает информацию о трассировке процесса работы php. Далее дебаггер нужно сдвинуть на след. строку, потом нажать "reload" в kcachegrind и вауля). Файл трассировки заново загружается и информация обновляется. Весь процесс работы php виден в буквальном смысле как на картинке(вкладка call graph).
PS думаю скоро с анимацией сделают какой-нить аддон)

Аватар пользователя VladSavitsky VladSavitsky 9 декабря 2008 в 14:32

temaonline,
я поставил у себя и xdebug, и kcachegrind.
В php.ini прописал нужные параметры, перегрузил сервер, но phpinfo() по прежнему показывает, что все отключено...
Как вы настраивали?

Аватар пользователя steklobiz steklobiz 9 декабря 2008 в 15:01

В свое время я тоже озадачился проблемой отладки при работе с Drupal и вот, что обнаружил:
Есть БЕСПЛАТНЫЙ отладчик - NetBeans. Его достаточно легко можно настроить под отладку Drupal. В интернете много информации по этой тематике

Аватар пользователя Artem Beloglazov Artem Beloglazov 9 декабря 2008 в 17:40

2 VladSavitsky вы из исходников ставили или уже готовый rpm/deb?
Часто путают zend_extension и просто extention.проверьте этот параметр. Лучше всего конечно установить готовый пакет и не знать проблем.
Вот моя конфигурация на Fedora 8(ставил из rpm)

zend_extension=/usr/lib/php/modules/xdebug.so

[Xdebug]
; включение/отключение профайлинга (1/0)
xdebug.profiler_enable = 0
; директория для результатов профайлинга (по умолчанию)
xdebug.profiler_output_dir = "/tmp"
; включение/отключение удаленного дебаггинга (1/0)
xdebug.remote_enable= 1
; указание удаленного хоста
debug.remote_host=192.168.1.4
; при включенном триггере можно php.ini отрубить профайлер, а просто передавать GET/POST ?XDEBUG_PROFILE=1
xdebug.profiler_enable_trigger= 1
xdebug.collect_params = 4
xdebug.collect_return = 1
xdebug.collect_vars = On
xdebug.show_mem_delta = 1
xdebug.var_display_max_children = 512

2 steklobiz NetBeans - это же IDE http://ru.wikipedia.org/wiki/NetBeans_IDE

Аватар пользователя VladSavitsky VladSavitsky 10 декабря 2008 в 17:15

temaonline,
Я ставил из rpm. Xdebug работает и перехватывает вывод ошибок в бразуер - тут все в порядке.
Не получается сделать трассировку кода.
Те настройки, что я добавил в php.ini ничего не меняют в phpinfo(). Такое ощущение, что они игнорируются. Возможно это неправильные параметры... У вас трассировка получилась?

Аватар пользователя Artem Beloglazov Artem Beloglazov 10 декабря 2008 в 18:14

Я в настройки авто-трассировки не вникал, а просто добавил в конф
xdebug.profiler_enable_trigger= 1
xdebug.profiler_output_dir = "/tmp"
и после передачи GET-параметра в браузере XDEBUG_PROFILE=1, указывал в kcachegrind путь к результату профильрования в папке /tmp и там сохранялся результат профилирования всего скрипта.
Я в статье не видел у вас про kcachegrind ничего. Если не уставновлена, то наверняка должна идти в родных репозиториях вашего дистра linux, либо можно в гугле поискать rpm-ку http://www.google.ru/search?q=kcachegrind+rpm.
Точечную трассировку я обычно не делаю, т.к. все же kcachegrind можно найти практически любой участок кода.

Аватар пользователя nleo nleo 11 декабря 2008 в 4:28

для решения свой проблемы потерянно функции http://drupal.ru/node/22492 стал искать отладчик с пошаговой трассировкой.

попробовал зенд - непонял как его к денверу прикрутить - отбросил
попробовал PHPEd - к денверу с помощью отладчика dbg-php-5.2.dll прикрутил, пошагово трассируется на ура, переменные показывает, но на брейкпоинт, который я поставил в юзер_релейшеншипс не реагирует, а пошагово туда добираться очень долго
попробовал NetBean - вродебы прикрутился, поставил настройки иксдебага как тут рекоммендованно, присутствие Xdebugа NetBeanом ощущается, но не брейкпоинты ни трассировка не работают

прям даже и хз что делать

Аватар пользователя Artem Beloglazov Artem Beloglazov 11 декабря 2008 в 14:10

2 nleo попробуйте установить Zend IDE или Eclipse (плагин PDT - http://www.eclipse.org/pdt/). Оба они оптимизированы под php-разработку, NetBean, насколько я понял, больше для java-девелоперов. Но проблема с брейкпоинтами у меня и в Эклипсе, я выделил несколько проблем. В целом, я думаю, некоторые решения по брейкпоинтам будут справедливы и для остальных IDE.

1. Cтарая версия индекса файлов. Бывает так, что файлы добавляются в проект из вне, и разработчик просто забывает сделать «Refresh» во вкладке «PHP Explorer». Но мало просто обновить состав файлов, нужно дополнительно обновить индекс в разделе «Project»(верхний менюбар), выбрав одну из опций:
Build All — из названия понятно, что построить индекс для всех открытых проектах.
Build Project — построить индекс текущего открытого проекта
Build Working Set — построить индекс для произвольного набора проектов.
Clean — очистить индекс выбранных проектов и построить его заново.
Build Automaticaly — автоматическое построение индекса. Для слабых компьютеров очень затратный процесс.

2. Path mapping. Другими словами следует в ручную указать два пути при конфигурировании сервера отладки в Eclipse:
- Прямой путь, не содержащий символические ссылки, непосредственно на сервере от корня.
- Путь в вашем проекте, или локальный путь.

3. Функции eval(), call_user_func() ... Бывает php-код хранится в базе или формируется динамически, а точка останова находится за этими местами, это вводит в заблуждение debugger и он их такие breakpoint`ы также игнорирует. Единственный возможный способ выявить такие места - это просматривать стек функций и ставить breakpoint непосредственно перед такие функциями и проходить их пошагово(«Step Into»).

PS рад буду, если кто-нить проверит на своих примерах(в IDE отличными от Eclipse(PDT), например http://xdebug.org/docs/remote) или дополнит своими решеними этой злободневной проблемы. Результат выложу на хабру.

Аватар пользователя nleo nleo 11 декабря 2008 в 11:36

если надо, я могу подробнее про PHPEd c этим дебаггером http://www.php-debugger.com/dbg/ расказать. Вообще PHPEd на первый взгляд понравился и бегает шустрее ява-иде(если для кого-то это важно). Плюс довольно прост в понимании. Сам дебагер добавился к денверу парой строк в php.ini Но один недостаток - PHPEd платный.

может с NetBean поиграюсь еще отпишусь

Аватар пользователя nleo nleo 11 декабря 2008 в 13:21

прикрутил NetBeans и XDebug к Денверу

Сначала установил XAMPP Lite (его настройка описывалась в доках к NetBeans, кстати XAMPP Lite - хороший All-In-One Package), проверил на нем NetBeans - все работает. Тогда скопировал оттуда php_xdebug.dll (хоть он и совпадал по размеру с уже имеющимся у меня) в /usr/local/php5/ext/php_xdebug.dll Денвера. В php.ini у меня получилось:

[XDebug]
zend_extension_ts="/usr/local/php5/ext/php_xdebug.dll"
xdebug.remote_enable=true
; разрешает трассировку исключительных ситуаций, даже
; если вы перехватили исключительную ситуацию:
xdebug.show_exception_trace = On

; выводит все локальные переменные самой внешней области видимости
; каждого вызова функции, включая еще не инициализированные переменные:
xdebug.show_local_vars = 1

;ограничение глубины рекурсии:
xdebug.max_nesting_level = 50

; указывает глубину вывода комплексной переменной:
xdebug.var_display_max_depth = 6

; управляют тем, какие суперглобальные переменные PHP
; включаются во все диагностические результаты
xdebug.dump_once = On
xdebug.dump_undefined = On
xdebug.dump.REQUEST = *
xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT

; для вывода суперглобальных переменных, перечисленных
; в настройках xdebug.dump.SUPERGLOBAL:
xdebug.dump_globals = On

все работает: трассировка, переменные и брейкпоинты

Аватар пользователя Artem Beloglazov Artem Beloglazov 11 декабря 2008 в 13:48

2 nleo
Видите, больше интересует решение проблем с точками останов, чем установка Ide. Проверьте брэйкпоинты в глубоких местах, там мож тоже возникнут проблемы. Хотя все равно спб) В будущем планирую NetBeans попробовать.

Аватар пользователя nleo nleo 11 декабря 2008 в 14:02

не знаю глубоко ли это Smile - файл modules\user_relationships\user_relationships_ui\user_relationships_ui.pages.inc
<?php
function user_relationships_page($account = NULL, $rtid = NULL) {
if (!$account) {// на эту строку поставил ТОЧКУ ОСТАНОВА
global $user;
$account = $user;
}

return theme('user_relationships', $account, $rtid);
}
?>

если скажете куда где еще потестить - попробую. сам пользоваться отладкой в ближайшее время не особо плотно планирую

Аватар пользователя Artem Beloglazov Artem Beloglazov 11 декабря 2008 в 14:45

2 nleo Я, пожалуй, не верно выразился. Под глубиной я имел ввиду не глубину в файловой системе, а глубину в стеке вызовов, а скорей точки останова, которые находятся за функциями eval(), call_user_func(), либо точки в файлах по символическим ссылкам. Именно в таких случаях возникают проблемы с breakpoint`ами.
А приведенный вами пример нормально работает, думаю, во всех IDE.

Аватар пользователя nleo nleo 11 декабря 2008 в 15:00

я думал, что user_relationships_page() глубоко не только по файловой системе, но и как раз за call_user_func()

phptemplate_preprocess_page() пойдет? если да то работает, но, кстати, апачь у меня уже раза три за все время после настройки вылетал с ошибкой во время трассировки, но пока не напрягает

Аватар пользователя Orion76 Orion76 28 сентября 2011 в 5:57

блин... седни тоже xdebug + NetBeans скрещивал..
Наверное всевышний добрался до мешка с проблемами "NetBeabs + XDebug"-)))

пихал-пихал в php.ini настройки - фффик-))
А они оказываются в /etc/php.d -))) (Mandriva 2011)