Дебаггер


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

Фреймворк ABC для этого оборудован достаточно мощным инструментом - дебаггером.

По умолчанию в фреймворке он отключен. Для того чтобы включить режим отладки, потребуется следующая настройка:

1
2
3
4
5

                
'debug' => [                               
                                
'bugsnare'         => true,   
                ],




Теперь при любой ошибке появится вот такая интерактивная таблица, где виден проблемный участок кода и стек вызовов с актуальными участками:

PHP Notice:
Undefined variable: $empty
(Не определена переменная: $empty)
in: ...\abc-framework\App\Views\MainView.php on line: 16
7
8
9
10
11
12
13
14
15
16
17
18
19
20

/** 
 * Класс MainView
 *  
 */   
class MainView extends Base
{
    public function 
createHello()
    { 
        echo 
$empty;
        
$content $this->model->getContent();
        echo 
$content['hello'];
    }
}
№№ Space Аction Line Path
1 ABC Abc::startApp() 5 ...\abc-framework\www\index.php
2 ABC\App\Controllers MainController->actionIndex() - PHP
3 ABC\App\Views MainView->createHello() 15 ...\abc-framework\App\Controllers\MainController.php
В стеке показаны области видимости, активные функции и методы, линии дальнейших вызовов, путь до файла. Если в стеке нажать на метод, откроются подробности. Это очень помогает проследить логическую цепочку. Кнопка "Arguments" откроет содержимое передаваемых аргументов.

Обратите внимание на перевод ошибки. Для того, чтобы включить эту опцию, нужно прописать следующую настройку:
1
2
3
4
5
6

                
'debug' => [                               
                                
'bugsnare'         => true//Режим дебаггинга
                                
'language'         => 'Ru'//Язык перевода отчета об ошибках
                
],




Если же хочется задействовать свой обработчик, можно включить режим исключений. При этом нужно отключть режим дебаггинга.
1
2
3
4
5
6
7

                
'debug' => [  
                                
'exception'        => true//Режим исключений
                                //'bugsnare'         => true, //Режим дебаггинга
                                
'language'         => 'Ru'//Язык перевода отчета об ошибках
                
],


В таком режиме на любую нефатальную ошибку будет брошено исключение, которое можно поймать и обработать, обернув блоком try строку запуска приложения:
1
2
3
4
5
6
7
8

    
try {
        \
ABC\Abc::startApp($local);
    } catch (
Exception $e) {
        
// Тут обработка
        
echo $e->getMessage();
    }




Кроме того, в любом месте программы доступна функция dbg(). Она выводит такую же таблицу для переменной. В аргумент, кроме переменной, можно помещать вызовы функций, объекты и имена классов. Она выводит всё содержимое с подробностями в очень читабельном подсвеченном виде.

ABC Message:
Tracing Variable
(трассировка переменной)
in: ...\abc-framework\App\Views\MainView.php on line: 16
1
2
3
4
5
6
array (size=1)
  'hello' => string 'Привет, Мир!' (length=21)
№№ Space Аction Line Path
1 ABC Abc::startApp() 5 ...\abc-framework\www\index.php
2 ABC\App\Controllers MainController->actionIndex() - PHP
3 ABC\App\Views MainView->createHello() 15 ...\abc-framework\App\Controllers\MainController.php
4 \ PHP>>>dbg() 16 ...\abc-framework\App\Views\MainView.php
Если вызвать её без аргумента, то это будет точка останова скрипта.

И последнее. Если захочется покопаться в кишках фреймворка, то можно включить режим полного стека. Тогда будет видна не только пользовательская, но и вся логическая цепочка. Сделать это можно такой настройкой:

1
2
3
4
5
6
7
8

                
'debug' => [  
                                
'exception'        => true,
                                
'bugsnare'         => true,
                                
'language'         => 'Ru'
                                
'framework_trace'  => true//Трассировка фреймворка
                
],