Для отладки и трассировки кода нужно установить и настроить 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-сервер:
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...
Комментарии
devel смотрели? а как насчет krumo?
Вы о чем?)
Xdebug - полнофункциональный отладчик серьезных php приложений.
devel - просто отладка вывода встроенных друпаловских функций.
krumo - а это вообще просто красивый вывод для var_dump();
А под windows?
«А под 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/ - и еще)
Спасибо.
temaonline, спасибо за ссылки - буду изучать.
Благодарю!
Есть еще xdebug.ru, но проект еще только на стадии развития. Статьи там в основном все с хабра.
открыл для себя ядерную фичу) при профилировании с xdebug+kcachegrind.
Вообщем нужно запустить дебаггер и остановить на первой строке, потом одновременно загрузить в kcachegrind файл, куда xdebug постепенно сливает информацию о трассировке процесса работы php. Далее дебаггер нужно сдвинуть на след. строку, потом нажать "reload" в kcachegrind и вауля). Файл трассировки заново загружается и информация обновляется. Весь процесс работы php виден в буквальном смысле как на картинке(вкладка call graph).
PS думаю скоро с анимацией сделают какой-нить аддон)
temaonline,
я поставил у себя и xdebug, и kcachegrind.
В php.ini прописал нужные параметры, перегрузил сервер, но phpinfo() по прежнему показывает, что все отключено...
Как вы настраивали?
В свое время я тоже озадачился проблемой отладки при работе с Drupal и вот, что обнаружил:
Есть БЕСПЛАТНЫЙ отладчик - NetBeans. Его достаточно легко можно настроить под отладку Drupal. В интернете много информации по этой тематике
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
temaonline,
Я ставил из rpm. Xdebug работает и перехватывает вывод ошибок в бразуер - тут все в порядке.
Не получается сделать трассировку кода.
Те настройки, что я добавил в php.ini ничего не меняют в phpinfo(). Такое ощущение, что они игнорируются. Возможно это неправильные параметры... У вас трассировка получилась?
Я в настройки авто-трассировки не вникал, а просто добавил в конф
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 можно найти практически любой участок кода.
для решения свой проблемы потерянно функции http://drupal.ru/node/22492 стал искать отладчик с пошаговой трассировкой.
попробовал зенд - непонял как его к денверу прикрутить - отбросил
попробовал PHPEd - к денверу с помощью отладчика dbg-php-5.2.dll прикрутил, пошагово трассируется на ура, переменные показывает, но на брейкпоинт, который я поставил в юзер_релейшеншипс не реагирует, а пошагово туда добираться очень долго
попробовал NetBean - вродебы прикрутился, поставил настройки иксдебага как тут рекоммендованно, присутствие Xdebugа NetBeanом ощущается, но не брейкпоинты ни трассировка не работают
прям даже и хз что делать
kcachegrind уже установлен. Буду пробовать. Спасибо.
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) или дополнит своими решеними этой злободневной проблемы. Результат выложу на хабру.
если надо, я могу подробнее про PHPEd c этим дебаггером http://www.php-debugger.com/dbg/ расказать. Вообще PHPEd на первый взгляд понравился и бегает шустрее ява-иде(если для кого-то это важно). Плюс довольно прост в понимании. Сам дебагер добавился к денверу парой строк в php.ini Но один недостаток - PHPEd платный.
может с NetBean поиграюсь еще отпишусь
Спасибо за статью
прикрутил NetBeans и XDebug к Денверу
Сначала установил XAMPP Lite (его настройка описывалась в доках к NetBeans, кстати XAMPP Lite - хороший All-In-One Package), проверил на нем NetBeans - все работает. Тогда скопировал оттуда php_xdebug.dll (хоть он и совпадал по размеру с уже имеющимся у меня) в /usr/local/php5/ext/php_xdebug.dll Денвера. В php.ini у меня получилось:
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
все работает: трассировка, переменные и брейкпоинты
2 nleo
Видите, больше интересует решение проблем с точками останов, чем установка Ide. Проверьте брэйкпоинты в глубоких местах, там мож тоже возникнут проблемы. Хотя все равно спб) В будущем планирую NetBeans попробовать.
не знаю глубоко ли это - файл 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);
}
?>
если скажете куда где еще потестить - попробую. сам пользоваться отладкой в ближайшее время не особо плотно планирую
2 nleo Я, пожалуй, не верно выразился. Под глубиной я имел ввиду не глубину в файловой системе, а глубину в стеке вызовов, а скорей точки останова, которые находятся за функциями eval(), call_user_func(), либо точки в файлах по символическим ссылкам. Именно в таких случаях возникают проблемы с breakpoint`ами.
А приведенный вами пример нормально работает, думаю, во всех IDE.
я думал, что user_relationships_page() глубоко не только по файловой системе, но и как раз за call_user_func()
phptemplate_preprocess_page() пойдет? если да то работает, но, кстати, апачь у меня уже раза три за все время после настройки вылетал с ошибкой во время трассировки, но пока не напрягает
Thanks for this very useful info you have provided us. I will bookmark this for future reference and refer it to my friends.
Online Sweepstakes
спам, нужно что-то делать. Третье сообщение за полчаса
Took me time to read few comments, because I translate and try to read this language but I enjoyed the article.Thanks for sharing.
Modular Homes In Nc
ааааааааааааааааа спамеры блять
Видео №1 Включение XDebug на Denwer - http://www.stepgt.com/content/video-%E2%84%961-vklyuchenie-xdebug-na-denwer
Видео №2 Отладка исходного кода PHP в среде IDE NetBeans - http://www.stepgt.com/content/video-%E2%84%962-otladka-iskhodnogo-koda-p...
блин... седни тоже xdebug + NetBeans скрещивал..
Наверное всевышний добрался до мешка с проблемами "NetBeabs + XDebug"-)))
пихал-пихал в php.ini настройки - фффик-))
А они оказываются в /etc/php.d -))) (Mandriva 2011)