Налагодження php функцій з допомогою phpdbg, як альтернатива Xdebug через IDE

Іноді доводиться працювати з сервером через «купу» фаєрволів, c локальних IP c репозиторієм і т. д., і з цієї причини досить важко налаштувати XDebug для роботи через IDE NetBeans (та інших IDE). Доводиться простіше піднімати локально віртуальну машину. І якщо XDebug потрібен лише для того, щоб по-швидкому ознайомитися з великим новим проектом (з купою легасі коду) з подальшим налагодженням через error_log, то налагоджувати окремі скрипти досить не завжди зручно в ньому.

Невірно спрацьовують точка переривання, зайвий стек виклику підключаються скриптів і т. д. Як варіант, для знайомства з новим проектом, можна ще налаштувати xhprof і по швидкому переглядати стек виклику функцій на графіках при виклику того чи іншого сценарію. В цьому випадку добре відловлювати помилки непотрібних дзвінків купи функцій в циклах, в яких немає всередині static ініціалізації змінної. Зокрема, виклики однієї і тієї ж налаштування бази даних всередині циклу foreach, for, while, do-while). Відмінність phpdbg від вище описаних інструментів в тому, що він дозволяє налагодити конкретно якусь функцію в логіці на рідкісний баг. Phpdbg це грубо кажучи командний (консольний) інтерфейс налагодження за аналогією як в NetBeans (xdebug). Якщо в IDE ми кліками мишки вказує точки переривання (breakpoint-ів), то в Phpdbg це потрібно робити у вигляді команд.

Наведу для прикладу простий код.

<?php

function EugeneKurilov() {
$i = 10;
for($j=0;$j<$i;$j++) {
//echo $j;
}

}

EugeneKurilov();

?>


Для вище наведеного PHP коду, для того, щоб почати налагоджувати функцію EugeneKurilov(), необхідно виконати команду:

prompt> break EugeneKurilov
[Breakpoint #0 added at EugeneKurilov]


А потім,

prompt> run
[Breakpoint #0 in EugeneKurilov() at /root/dbg.php:3, hits: 1]
>00003: function EugeneKurilov() {
00004: $i = 10;
00005: for($j=0;$j<$i;$j++) {



Натискаючи кнопку s (step), ми проходимо по тілу функції, для того, щоб переглянути, як змінюється змінна $j, необхідно виконати команду watch $j:

[Breakpoint #0 in EugeneKurilov() at /root/dbg.php:3, hits: 1]
>00003: function EugeneKurilov() {
00004: $i = 10;
00005: for($j=0;$j<$i;$j++) {
prompt> watch $j
[Set watchpoint on $j]


І далі, натискати s (step) для проходу.

[Breaking on watchpoint $j]
Old value:
New value: 0
>00005: for($j=0;$j<$i;$j++) {
00006: //echo $j;
00007: }
prompt>

Old value: 0
New value: 1
>00005: for($j=0;$j<$i;$j++) {
00006: //echo $j;
00007: }

Old value: 9
New value: 10
>00005: for($j=0;$j<$i;$j++) {
00006: //echo $j;
00007: }
prompt> s
[L5 0x7f9d0c088100 IS_SMALLER $j $i ~3 /root/dbg.php]
[L5 0x7f9d0c088120 EXT_STMT /root/dbg.php]
[L5 0x7f9d0c088140 JMPNZ ~3 J6 /root/dbg.php]
[L9 0x7f9d0c088160 EXT_STMT /root/dbg.php]
>00009: }

prompt> s
[L11 0x7f9d0c0735e0 RETURN 1 /root/dbg.php]
[Script ended normally]


Тобто досить просто таким чином в живу переглядати як змінюється значення змінної і не потрібно додавати код начебто error_log (при перегляді в балці) або echo в броузері.

Phpdbg досить простий (для вивчення функціонала необхідно ввести help) і з цієї причини немає сенсу детально описувати всі моменти. Починаючи з версії PHP 5.6 він включений за замовчуванням. Моєю метою даної публікації було показати альтернативний варіант налагодження коду. Як показує моя практиці, прохід різними debug-інструментами за новим проектом дозволяє швидко зрозуміти його архітектуру для випадку коли немає документації, а проект розроблявся одночасно великою кількістю співробітників.
Джерело: Хабрахабр
  • avatar
  • 0

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.