Як ви налагоджуєте PHP-скрипти? [зачинено]


403

Як ви налагоджуєте PHP- скрипти?

Мені відомі основні налагодження, такі як використання Повідомлення про помилки. Налагодження точки перерви в PHPEclipse також досить корисно.

Який найкращий (з точки зору швидкого та легкого) спосіб налагодження у phpStorm чи будь-якому іншому IDE?


Дивіться також: stackoverflow.com/questions/4640421 / ...
kenorb


40
Я вважаю, що це чудове питання! Коли ви не знаєте, як підійти до налагодження PHP, ви навіть не знаєте, як скласти своє запитання, не знаєте, як бути точнішим за це. Так, він може не підкорятися правилам Стек, але це, безумовно, дуже допомагає нам, новачкам!
Михайла

1
з php5.4 далі представлений новий налагоджувач інтерфейсу командного рядка під назвою phpdbg ( phpdbg.com ). PHP5.6 поставляється з типовим phpdbg.
Ганеш Патіл

1
Коли-небудь чули про XDebug? :)
Пратік

Відповіді:


145

Спробуйте Eclipse PDT, щоб налаштувати середовище Eclipse, яке має функції налагодження, як ви згадали. Можливість перейти до коду є набагато кращим способом налагодження, ніж старий метод var_dump та друк у різних точках, щоб побачити, де ваш потік йде не так. Коли все інше не вдається, і все, що у мене є, є SSH і vim, я все ще var_dump()/ die()щоб знайти, де код іде на південь.


35
Вам слід скористатися цією функцією: kill ($ data) {die (var_dump ($ data)); } Це економить набравши 10 символів, найкраща функція, яку я коли-небудь писав
tbh


2
Чи є спосіб прикрасити "var_dump"?
RPDeshaies

6
@ AlexMorley-Finch Я піднімаю вас доkill($data) { echo "<pre>"; var_dump($data); echo "</pre>"; exit; }
Франсіско Презенсія

2
Посилання можна "відновити" через неймовірний веб-архів , остання перевірка станом на 7 травня '15.
Грубер

80

Ви можете використовувати додаток Firephp до firebug для налагодження php у тому ж середовищі, що і javascript.

Я також використовую згаданий раніше Xdebug для профілювання php.


3
Ось короткий посібник із використання FirePHP: sitepoint.com/debug-php-firebug-firephp
Mihaela

38

Це моє маленьке середовище налагодження:

error_reporting(-1);
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 0);
assert_options(ASSERT_BAIL, 0);
assert_options(ASSERT_QUIET_EVAL, 0);
assert_options(ASSERT_CALLBACK, 'assert_callcack');
set_error_handler('error_handler');
set_exception_handler('exception_handler');
register_shutdown_function('shutdown_handler');

function assert_callcack($file, $line, $message) {
    throw new Customizable_Exception($message, null, $file, $line);
}

function error_handler($errno, $error, $file, $line, $vars) {
    if ($errno === 0 || ($errno & error_reporting()) === 0) {
        return;
    }

    throw new Customizable_Exception($error, $errno, $file, $line);
}

function exception_handler(Exception $e) {
    // Do what ever!
    echo '<pre>', print_r($e, true), '</pre>';
    exit;
}

function shutdown_handler() {
    try {
        if (null !== $error = error_get_last()) {
            throw new Customizable_Exception($error['message'], $error['type'], $error['file'], $error['line']);
        }
    } catch (Exception $e) {
        exception_handler($e);
    }
}

class Customizable_Exception extends Exception {
    public function __construct($message = null, $code = null, $file = null, $line = null) {
        if ($code === null) {
            parent::__construct($message);
        } else {
            parent::__construct($message, $code);
        }
        if ($file !== null) {
            $this->file = $file;
        }
        if ($line !== null) {
            $this->line = $line;
        }
    }
}

2
Дякую. Це врятувало мені день. (Я просто повинен був видалити це E_STRICT)
SEc

4
assert_callcackхе
Madbreaks

32

Xdebug та плагін DBGp для Notepad ++ для важкого полювання на помилок, FirePHP для легких речей. Швидкий і брудний? Нічого не перемагає dBug .


Плагін DBGp не працює з поточною версією блокнота ++ / xdebug, і не планується його виправляти. Ви можете побачити мою дискусію з творцем, пов’язаним тут
Джо

26

XDebug має важливе значення для розвитку. Я встановлюю його перед будь-яким іншим розширенням. Це дає сліди стеки на будь-яку помилку, і ви можете легко включити профілювання.

Для швидкого ознайомлення з використанням структури даних var_dump(). Не використовуйте, print_r()тому що вам доведеться оточити його, <pre>і він друкує лише один вар за один раз.

<?php var_dump(__FILE__, __LINE__, $_REQUEST); ?>

Для справжнього середовища налагодження найкращим, що я знайшов, є Komodo IDE, але він коштує $ $.


19

PhpEd справді хороший. Ви можете переходити до / над / виключати функції. Ви можете запускати спеціальний код, перевіряти змінні, змінювати змінні. Це дивовижно.


4
Я використовував PhpEd, і не маю для нього добрих слів у порівнянні з реальними IDE, такими як NetBeans або Eclipse, і цей коментар не додає нічого корисного до питання. -1
siliconrockstar

Я спробував більшість IDE (включаючи Zend, NetBeans та Eclipse), перш ніж купувати PhpED Professional, тому що це було найкраще за півтора милі. Це було кілька років тому, тому інші, можливо, згодом покращилися, але в той час більшість з них були болісно повільними, оскільки написані на Java. Я не розумію, як у когось може бути "не добрих слів для цього", коли (для мене) це було настільки очевидно найкраще, рішення було беззаконне.
lm713

17

1) Я використовую print_r (). У TextMate у мене є фрагмент 'pre', який розширюється на це:

echo "<pre>";
print_r();
echo "</pre>";

2) Я використовую Xdebug, але мені не вдалося змусити графічний інтерфейс працювати правильно на моєму Mac. Він принаймні виводить читабельну версію трасування стека.


Я впевнений, ти маєш на увазі відлуння "</pre>"; в кінці, хоча.
altermativ

9
Ви також можете передати 'true' у функцію, щоб вона повернула рядок. Це означає, що ви можете це зробити:echo '<pre>', print_r($var, true), '</pre>';
Незадоволенеотримання


16

Чесно кажучи, поєднання print та print_r () для друку змінних. Я знаю, що багато хто вважає за краще використовувати інші більш прогресивні методи, але я вважаю це найпростішим у використанні.

Я скажу, що я не цілком оцінив це, доки я не зробив кілька мікропроцесорних програмувань в Uni і не зміг використати навіть це.


Я радий, що ви згадали про друк, а також про print_r, я використовую базовий принт, щоб побачити, чи виконаний код до певного моменту, що допомагає вирішити проблему.
Бред

Я використовую і print, і var_dump (). Я використовую print для відображення повідомлень про налагодження та інформацію та var_dump, щоб вказати стан змінних у міру просування справи.
Джошуа К

14

Xdebug , Дерік Ретханс, дуже хороший. Я користувався ним деякий час тому і виявив, що встановити його не так просто. Як тільки ви закінчите, ви не зрозумієте, як вам обійшлося без нього :-)

Є гарна стаття про Zend Developer Zone (установка на Linux не здається легшою) і навіть плагін Firefox , який я ніколи не використовував.


2
Це не просто встановлення, що засмучує. Налаштування Xdebug для роботи з Eclipse може бути кошмаром. Мені вдалося встановити Xdebug, встановлений на CentOS 5, але EclipsePDT + Xdebug не хочу співпрацювати :(
Jahangir


11

Я використовую Netbeans з XDebug та додатком Easy XDebug FireFox

Додаток є важливим при налагодженні MVC-проектів, оскільки звичайний спосіб запуску XDebug в Netbeans - це реєстрація сеансу налагодження через URL-адресу. За допомогою додатку, встановленого в FireFox, ви встановите властивості проекту Netbeans -> Запустити конфігурацію -> Додатково та виберіть "Не відкривати веб-браузер". Тепер ви можете встановити точки перерви та розпочати сеанс налагодження за допомогою Ctrl-F5 як завжди . Відкрийте FireFox і клацніть правою кнопкою миші значок додатка в правому нижньому куті, щоб почати моніторинг точок прориву. Коли код досягне точки розриву, він зупиниться, і ви можете перевірити ваші змінні стани та стек викликів.


10

Буферизація вихідних даних дуже корисна, якщо ви не хочете зіпсувати результат. Я роблю це в однокласиці, яку я можу коментувати / коментувати за бажанням

 ob_start();var_dump(); user_error(ob_get_contents()); ob_get_clean();


9

У PhpEdit є вбудований налагоджувач, але я, як правило, використовую echo (); і print_r (); старомодний спосіб !!


8

Для справді гострих проблем, які потребують занадто багато часу, щоб використовувати print_r / echo, щоб з'ясувати, я використовую функцію налагодження моєї IDE (PhpEd). На відміну від інших IDE, якими я користувався, PhpEd не потребує значних налаштувань. Єдиною причиною того, що я не користуюся ним для будь-яких проблем, з якими стикаються, є те, що він болісно повільний. Я не впевнений, що повільність характерна для PhpEd або будь-якого налагоджувача php. PhpEd не є безкоштовним, але я вважаю, що в будь-якому випадку він використовує один з налагоджувачів з відкритим кодом (як, наприклад, XDebug). Користь із PhpEd, знову ж таки, полягає в тому, що він не потребує налаштувань, які в минулому я вважав дуже втомливими.


2
Налагоджувач PHPEd насправді написаний тим самим хлопцем, який написав PHPEd, і я впевнений, що це не з відкритим кодом. Принаймні PHPEd не постачається з джерелом, а замість цього компілюється .so's та .dll.
Артем Русаковський

4

Ручна налагодження для мене зазвичай швидша - var_dump()і debug_print_backtrace()це всі інструменти, необхідні для озброєння вашої логіки.


3

Ну, певною мірою це залежить від того, куди йдуть справи на південь. Це перше, що я намагаюся ізолювати, а потім за необхідності використовувати echo / print_r ().

NB: Ви, хлопці, знаєте, що ви можете передати true як другий аргумент print_r (), і він поверне висновок замість друку? Наприклад:

echo "<pre>".print_r($var, true)."</pre>";

2
Я просто зафіксував це у функції під назвою налагодження. Тож я можу робити налагодження ($ var);
jdelator

3

Я часто використовую CakePHP, коли Rails неможливий. Для налагодження помилок я зазвичай знаходжу error.logв папці tmp і забиваю її в терміналі командою ...

tail -f app/tmp/logs/error.log

Це дає вам запустити діалог із торта того, що відбувається, що досить зручно, якщо ви хочете вивести щось середній код, який ви можете використовувати.

$this->log('xxxx');

Зазвичай це може дати вам гарне уявлення про те, що відбувається / неправильно.



2

Komodo IDE добре працює з xdebug, навіть для віддаленої налагодження. Для цього потрібна мінімальна кількість конфігурації. Все, що вам потрібно, це версія php, яку Komodo може використовувати локально, щоб перейти через код на точку розриву. Якщо у вас є сценарій, імпортований у проект komodo, ви можете встановити точки перерви клацанням миші саме так, як ви встановили його всередині затемнення для налагодження програми Java. Віддалене налагодження, очевидно, складніше, щоб змусити його працювати правильно (можливо, вам доведеться зіставити віддалений URL з скриптом php у вашій робочій області), ніж локальна настройка налагодження, яку досить легко налаштувати, якщо ви працюєте на MAC або на робочому столі Linux .



2

Існує безліч методів налагодження PHP, які можуть заощадити безліч годин при кодуванні. Ефективна, але основна методика налагодження - це просто включити повідомлення про помилки. Інша трохи більш досконала методика передбачає використання операторів друку, які можуть допомогти визначити більш невловимі помилки, показуючи, що насправді відбувається на екрані. PHPeclipse - це плагін Eclipse, який може виділити поширені синтаксичні помилки і може використовуватися разом із відладчиком для встановлення точок перерви.

display_errors = Off
error_reporting = E_ALL 
display_errors = On

а також використовували

error_log();
console_log();

1

У виробничому середовищі я реєструю відповідні дані до журналу помилок сервера error_log ().


а чим хвіст -f ... чудово працює
markus_p

1

Я використовую zend studio для затемнення із вбудованим налагоджувачем. Його все ще повільно порівняно з налагодженням з eclipse pdt з xdebug. Сподіваємось, вони вирішать ці проблеми, швидкість покращилася за останні випуски, але все ж перехід на речі займає 2-3 секунди. Панель інструментів zend firefox дійсно полегшує справи (налагодження наступної сторінки, поточної сторінки тощо). Крім того, він пропонує профайлер, який буде орієнтувати ваш код і надавати кругові діаграми, час виконання тощо.


1

Більшість помилок можна легко знайти просто var_dump за допомогою деяких ключових змінних, але це очевидно залежить від того, який саме додаток ви розробляєте.

Для більш складних алгоритмів дуже корисні функції кроків / точок перегляду / перегляду (якщо немає необхідності)


1

PHP DBG

Інтерактивний покроковий налагоджувач PHP, реалізований як модуль SAPI, може давати вам повний контроль над навколишнім середовищем, не впливаючи на функціональність або продуктивність вашого коду. Він має на меті бути легкою, потужною, простою у користуванні платформою для налагодження для PHP 5.4+ і постачається нестандартно з PHP 5.6.

Особливості включають:

  • Покрокова налагодження
  • Гнучкі точки перерви (метод класу, функція, файл: рядок, адреса, код коду)
  • Легкий доступ до PHP за допомогою вбудованого eval ()
  • Легкий доступ до виконуваного в даний час коду
  • API Userland
  • SAPI Agnostic - легко інтегрується
  • Підтримка файлу конфігурації PHP
  • JIT Super Globals - Установіть власні !!
  • Необов'язкова підтримка лінії перегляду - Зручна експлуатація терміналу
  • Підтримка віддаленої налагодження - пакетний графічний інтерфейс Java
  • Простота експлуатації

Дивіться скріншоти:

PHP DBG - Покрокова налагодження - скріншот

PHP DBG - Покрокова налагодження - скріншот

Головна сторінка: http://phpdbg.com/

Помилка PHP - краща звітність про помилки для PHP

Це дуже проста у використанні бібліотека (фактично файл) для налагодження ваших PHP-скриптів.

Єдине, що вам потрібно зробити - це включити один файл, як показано нижче (на початку у своєму коді):

require('php_error.php');
\php_error\reportErrors();

Тоді всі помилки дадуть вам інформацію, таку як зворотний шлях, контекст коду, аргументи функції, змінні сервера тощо. Наприклад:

Помилка PHP |  Покращити повідомлення про помилки для PHP - знімок екрана Помилка PHP |  Покращити повідомлення про помилки для PHP - знімок екрана Помилка PHP |  Покращити повідомлення про помилки для PHP - знімок екрана

Особливості включають:

  • тривіально використовувати, це лише один файл
  • помилки, що відображаються в браузері для звичайних та ajaxy запитів
  • Запити AJAX призупиняються, що дозволяє автоматично їх повторно запускати
  • робить помилки максимально суворими (заохочує якість коду та прагне покращити продуктивність)
  • фрагменти коду по всьому сліду стека
  • надає більше інформації (наприклад, повноцінні підписи)
  • виправляє деякі повідомлення про помилки, які явно невірно
  • підсвічування синтаксису
  • виглядає красиво!
  • налаштування
  • вручну вмикати та вимикати
  • запускати конкретні розділи без повідомлення про помилки
  • ігноруйте файли, що дозволяє уникнути виділення коду у трасі стека
  • файли додатків; вони мають пріоритет, коли виявляється помилка!

Головна сторінка: http://phperror.net/

GitHub: https://github.com/JosephLenton/PHP-Error

Моя вилка (з додатковими виправленнями): https://github.com/kenorb-contrib/PHP-Error

DTrace

Якщо ваша система підтримує динамічне відстеження DTrace (встановлено за замовчуванням на OS X), а ваш PHP компілюється з увімкненими зондами DTrace ( --enable-dtrace), які повинні бути за замовчуванням, ця команда може допомогти вам налагодити PHP-скрипт без часу:

sudo dtrace -qn 'php*:::function-entry { printf("%Y: PHP function-entry:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2); }'

Отже, з урахуванням наступних псевдонімів додано у ваші rc- файли (наприклад ~/.bashrc, ~/.bash_aliases):

alias trace-php='sudo dtrace -qn "php*:::function-entry { printf(\"%Y: PHP function-entry:\t%s%s%s() in %s:%d\n\", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2); }"'

Ви можете відстежувати ваш скрипт з легко запам'ятовується псевдонімом: trace-php.

Ось більш просунутий сценарій dtrace, просто збережіть його dtruss-php.d, зробіть його виконуваним ( chmod +x dtruss-php.d) та запустіть:

#!/usr/sbin/dtrace -Zs
# See: https://github.com/kenorb/dtruss-lamp/blob/master/dtruss-php.d

#pragma D option quiet

php*:::compile-file-entry
{
    printf("%Y: PHP compile-file-entry:\t%s (%s)\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1));
}

php*:::compile-file-return
{
    printf("%Y: PHP compile-file-return:\t%s (%s)\n", walltimestamp, basename(copyinstr(arg0)), basename(copyinstr(arg1)));
}

php*:::error
{
    printf("%Y: PHP error message:\t%s in %s:%d\n", walltimestamp, copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}

php*:::exception-caught
{
    printf("%Y: PHP exception-caught:\t%s\n", walltimestamp, copyinstr(arg0));
}

php*:::exception-thrown
{
    printf("%Y: PHP exception-thrown:\t%s\n", walltimestamp, copyinstr(arg0));
}

php*:::execute-entry
{
    printf("%Y: PHP execute-entry:\t%s:%d\n", walltimestamp, basename(copyinstr(arg0)), (int)arg1);
}

php*:::execute-return
{
    printf("%Y: PHP execute-return:\t%s:%d\n", walltimestamp, basename(copyinstr(arg0)), (int)arg1);
}

php*:::function-entry
{
    printf("%Y: PHP function-entry:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}

php*:::function-return
{
    printf("%Y: PHP function-return:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}

php*:::request-shutdown
{
    printf("%Y: PHP request-shutdown:\t%s at %s via %s\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1), copyinstr(arg2));
}

php*:::request-startup
{
    printf("%Y, PHP request-startup:\t%s at %s via %s\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1), copyinstr(arg2));
}

Головна сторінка: dtruss-lamp у GitHub

Ось просте використання:

  1. Run: sudo dtruss-php.d.
  2. На іншому терміналі виконайте: php -r "phpinfo();".

Щоб перевірити це, ви можете перейти до будь-якої docroot із index.phpта запустити вбудований сервер PHP:

php -S localhost:8080

Після цього ви можете зайти на сайт за адресою http: // localhost: 8080 / (або вибрати будь-який зручний для вас порт). Звідти перейдіть на деякі сторінки, щоб побачити вихід сліду.

Примітка: Dtrace доступний на OS X за замовчуванням, в Linux вам, ймовірно, потрібен dtrace4linux або перевірити наявність інших альтернатив .

Див.: Використання PHP та DTrace на php.net


SystemTap

Також можна перевірити відстеження SystemTap, встановивши пакет розробки SystemTap SDT (наприклад, yum install systemtap-sdt-devel ).

Ось приклад script ( all_probes.stp) для відстеження всіх основних статичних точок зонда PHP протягом усієї тривалості запущеного PHP-скрипту з SystemTap:

probe process("sapi/cli/php").provider("php").mark("compile__file__entry") {
    printf("Probe compile__file__entry\n");
    printf("  compile_file %s\n", user_string($arg1));
    printf("  compile_file_translated %s\n", user_string($arg2));
}
probe process("sapi/cli/php").provider("php").mark("compile__file__return") {
    printf("Probe compile__file__return\n");
    printf("  compile_file %s\n", user_string($arg1));
    printf("  compile_file_translated %s\n", user_string($arg2));
}
probe process("sapi/cli/php").provider("php").mark("error") {
    printf("Probe error\n");
    printf("  errormsg %s\n", user_string($arg1));
    printf("  request_file %s\n", user_string($arg2));
    printf("  lineno %d\n", $arg3);
}
probe process("sapi/cli/php").provider("php").mark("exception__caught") {
    printf("Probe exception__caught\n");
    printf("  classname %s\n", user_string($arg1));
}
probe process("sapi/cli/php").provider("php").mark("exception__thrown") {
    printf("Probe exception__thrown\n");
    printf("  classname %s\n", user_string($arg1));
}
probe process("sapi/cli/php").provider("php").mark("execute__entry") {
    printf("Probe execute__entry\n");
    printf("  request_file %s\n", user_string($arg1));
    printf("  lineno %d\n", $arg2);
}
probe process("sapi/cli/php").provider("php").mark("execute__return") {
    printf("Probe execute__return\n");
    printf("  request_file %s\n", user_string($arg1));
    printf("  lineno %d\n", $arg2);
}
probe process("sapi/cli/php").provider("php").mark("function__entry") {
    printf("Probe function__entry\n");
    printf("  function_name %s\n", user_string($arg1));
    printf("  request_file %s\n", user_string($arg2));
    printf("  lineno %d\n", $arg3);
    printf("  classname %s\n", user_string($arg4));
    printf("  scope %s\n", user_string($arg5));
}
probe process("sapi/cli/php").provider("php").mark("function__return") {
    printf("Probe function__return: %s\n", user_string($arg1));
    printf(" function_name %s\n", user_string($arg1));
    printf("  request_file %s\n", user_string($arg2));
    printf("  lineno %d\n", $arg3);
    printf("  classname %s\n", user_string($arg4));
    printf("  scope %s\n", user_string($arg5));
}
probe process("sapi/cli/php").provider("php").mark("request__shutdown") {
    printf("Probe request__shutdown\n");
    printf("  file %s\n", user_string($arg1));
    printf("  request_uri %s\n", user_string($arg2));
    printf("  request_method %s\n", user_string($arg3));
}
probe process("sapi/cli/php").provider("php").mark("request__startup") {
    printf("Probe request__startup\n");
    printf("  file %s\n", user_string($arg1));
    printf("  request_uri %s\n", user_string($arg2));
    printf("  request_method %s\n", user_string($arg3));
}

Використання:

stap -c 'sapi/cli/php test.php' all_probes.stp

Див.: Використання SystemTap з статичними зондами PHP DTrace на php.net


0

+1 для print_r (). Використовуйте його для скидання вмісту об'єкта чи змінної. Щоб зробити його більш читабельним, зробіть це за допомогою попереднього тегу, щоб вам не потрібно було переглядати джерело.

echo '<pre>';
print_r($arrayOrObject);

Також var_dump ($ thing) - це дуже корисно, щоб побачити тип підзаголовок


Розширену версію можна знайти тут devarticles.in/php/useful-function-to-output-debug-data-in-php
K.


0

Залежно від проблеми, мені подобається комбінація error_reporting (E_ALL), змішана з тестами ехо (щоб знайти рядки / файли, що порушують, помилка сталася в первісному знанні; ви знаєте, що не завжди php-файл рядка / файлу говорить вам правильно?), Відповідність дужки IDE (щоб вирішити "Помилка розбору: помилка синтаксису, несподівані проблеми із завершенням $ end") та print_r (); вихід; дамп (справжні програмісти переглядають джерело; p).

Ви також не можете перемогти phpdebug (перевірити sourceforge) за допомогою "memory_get_usage ();" та "memory_get_peak_usage ();" знайти проблемні зони.


0

Інтегровані налагоджувачі, де ви можете спостерігати за змінами змінних змін, переходячи через код, справді круті. Однак вони потребують налаштування програмного забезпечення на сервері та певної кількості конфігурації на клієнті. Вони потребують періодичного обслуговування, щоб підтримувати справний стан.

Print_r легко написати, і він гарантовано працює в будь-яких налаштуваннях.


0

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

Ви також можете змінити загальний клас винятку, так що цей тип налагодження є напівавтоматизованим.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.