Gdb

Материал из PhpWiki.

Перейти к: навигация, поиск

Отладка php с помощью gdb

Sveta Smirnova, http://phpclub.ru/faq/

Имеется в виду отладка именно PHP, а не скриптов, написаных на PHP. Нужно это не только разработчикам языка, но и обычным пользователям. Хотя бы для того, чтобы правильно составить bug-report.

Ремарка [скептикам]: при правильно составленном баг-репорте скорость устранения бага разработчиками PHP доходит до трёх часов!

Итак, приступим.

Надо отметить, что за последний год были сделаны изменения, которые сильно упростили сборку PHP под Windows, а также появилась возможность загрузить с сайта snaps.php.net debug-символы: это значит, что собирать PHP самим для того, чтобы получить backtrace, необязательно. Мы рассмотрим и как получить backtrace, не собирая PHP. А также как получить его, собрав PHP самостоятельно.

В обоих случаях нам понадобится gdb (The GNU debugger). Я использую cygwin, альтернативный способ описан здесь: [1].

Установим cygwin. Для этого возьмём инсталлятор с http://www.cygwin.com, запустим его и нажмём “Next”. Он установит минимальный набор пакетов. (Можно выбрать 3 опции: загрузить без установки, установить из интернет, установить из локальной папки. Как ими манипулировать, я думаю, вы разберётесь без моей помощи.)

Установим gdb. Снова запускаем инсталлятор cygwin-а, но на этот раз из списка пакетов выбираем gdb.

Далее вы должны либо собрать PHP самостоятельно, либо загрузить со snaps.php.net Debugger symbols и положить их в ту же директорию, где у вас назодится php.exe Можно приступать к отладке.

Внимание! Перед тем, как начитнать отлаживать PHP, загрузите самую свежую версию со snaps.php.net: в 90% случаев найденный с таким трудом баг оказывается уже исправлен.

Для наших тестов создадим скрипт, вызывающий segfault и сохраним его как script.php

У меня директория bin поставки cygwin, так же как и корневая директория PHP, в переменной PATH. Если у вас это не так, используйте полные пути.

Откройте консоль (не обязательно cygwin bash shell, можно штатную Windows). Смените директорию на ту, где находится ваш script.php

Проще всего отлажитвать консольный вариант PHP.

Для этого наберите в консоли

gdb php.exe

Появится приглашение отладчика, набирайте run script.php:

gdb>run script.php

Отладчик выведет сообщения. После этого набирайте

gdb>bt

и любуйтесь backtace-ом. В некоторых случаях потребуется повторить. Для того, чтобы отладить скрипт, который вызывает падение только при запуске PHP как модуля Apache, наберите

gdb /path/to/httpd.exe

И в отладчике

gdb>run -X

Потом открываете в браузере страничку, которая вызывает segfault и получаете bt также, как и в консольном варианте:

gdb>bt

Для того, чтобы скопировать в буфер обмена полученный backtrace:

Если вы используете штатную консоль Windows, нажмите в любом месте консоли правую кнопку мыши, после чего появится меню, с помощью которого вы сможете выделить, а потом скопировать текст. Если вы используете cygwin bash shell (или штатную консоль Windows) щёлкните левой кнопкой мыши по иконке в левом верхнем углу консоли. Откроется меню, также позволяющее выделить, а потом скопировать текст.

Всё =)

Дополнение от tony2001 - как получить php-шный backtrace

Вопрос: Один из процессов httpd периодически выполняет что-то странное - отъедает до 400 метров памяти и нагружает процессор. Как понять, чем он занят?

Положить .gdbinit из php-src/ себе в $HOME, приаттачиться к апачевскому чайлду

 # gdb
(gdb) attach <pid>

прервать выполнение Ctrl+C и выполнить

dump_bt executor_globals.current_execute_data

в консоли GDB.

В результате будет PHP-шный бэктрэйс до того места, на котором прервалось выполнение.

Ссылки
Реклама