Как вы храните код отладки из производства? - PullRequest
28 голосов
/ 09 декабря 2010

Это случается с лучшими из нас.

alt text

Особенно при работе с языками без встроенных возможностей отладки, таких как точки останова и отслеживаемые переменные, эти ошибки кусают разработчиков.Отладочный код, оповещения и Response.Writes отображаются в рабочем коде.

Как вы отличаете проблемы отладки от функционального кода в javascript, php или vbscript?Как вы гарантируете, что эти отладочные изменения никогда не попадут в производственную среду?

Ответы [ 16 ]

13 голосов
/ 09 декабря 2010

Самый простой метод

define("DEBUG", true);


if (DEBUG) {
    echo "Debug Method";
}

Для js это похоже.

3 голосов
/ 09 декабря 2010

Человеческую ошибку трудно предотвратить

https://meta.stackexchange.com/questions/71780/lol-debugging-are-we-so-homepage-alerts-false

2 голосов
/ 09 декабря 2010

Возможно, он не идеален, но в моем редакторе есть макрос, который позволяет мне добавить отладку и обернуть ее в соответствующие помечающие комментарии. У меня также есть скрипт, который я запускаю позже, который вырывает все это обратно. Конечно, мне потребовалось некоторое время, чтобы по-настоящему доверять этому механизму, но со временем я освоился с ним.

Я предпочитаю избегать проверки кода отладки. Очевидно, что, как и в случае с любым другим «правилом», из этого правила есть исключения, но, поскольку потом легко что-то упустить, я не люблю проверять это.

2 голосов
/ 09 декабря 2010

Существует несколько способов скрыть отладочный код в рабочей среде, но немногие удаляют его (когда компилятор не может автоматически удалить его).

Я скрываю отладочный код:

  • Отображается только в том случае, если зарегистрированный пользователь является разработчиком или тестером.
  • Вывод его в журнал / базу данных на стороне сервера.

Я удаляю его путем поиска специальных комментариев перед развертыванием:

  • alert("false") //TODO:REMOVE DEBUG CODE

Мои коллеги также предложили:

  • Переопределение alert для проверки отладочной переменной.(Побочные эффекты?)
  • Написание метода alertDebug для проверки отладочной переменной.(Кто-нибудь помнит это?)
  • Проверка, запущен ли firebug

    if(window.console && window.console.firebug) { alert("you are using firebug"); }

2 голосов
/ 09 декабря 2010

Один метод с переменной среды. В конфигурации вашего сервера вы можете установить переменную окружения, чтобы сказать отладка или нет. Производственные серверы будут настроены на false, а разработка - на true. Таким образом, все, что вы делаете в коде, это проверяете переменную среды:

В PHP:

if (getenv('DEBUG_MODE')) {
    var_dump($foo);
}

Таким образом, нет никакого способа забыть, так как он автоматически отключится. Но если вам ДЕЙСТВИТЕЛЬНО нужно включить его в работе, просто нажмите переключатель ...

1 голос
/ 07 ноября 2018

Если это только «избежать отладок в работе», используйте встроенную функцию assert ().

Это позволяет вообще не обрабатывать ваши сообщения отладки и предотвращает использование памяти любыми вычислениями, которые у вас там есть.или вычислительная мощность.

assert полностью игнорируется при производстве.

function debug(...$stuff){
    var_dump($stuff);
    return true; //always return true so assert will always pass it.
}
assert(debug("This code will not even be processed on production server. "));

Это самый безопасный способ, но не очень гибкий.

Один из методов, который я часто использовал, этопроверить имя хоста или IP-адрес клиента.

Итак, у меня есть функция для проверки имени хоста следующим образом:

function onTestServer(){
    $SERVER_NAME = $_SERVER["SERVER_NAME"];

    if(substr($SERVER_NAME,-5)==="te.st") return true;//all *.te.st domains are test servers
    if (strpos($SERVER_NAME, ".localhost")!==false) return true; //all *.localhost domains are test servers
    return false;
}

А затем у меня есть свой собственный vardump, debug и dieоператоры, которые не будут выполняться в рабочей среде, аналогичны следующим:

<code>function varDump($stuff){
    if (!onTestServer()) return;
    echo "<pre>";
    var_dump($stuff);
    echo "
";}

Тогда вы просто когда-либо будете использовать только пользовательскую функцию varDump (), чтобы ее могли видеть только вы.

Мои функции отладки намного сложнее и показывают расширяемые деревья информации и т. Д. Но основной принцип тот же: если на локальном хосте делать vardumps и т. Д., В противном случае ничего не отображается.

Очень удобно, если вы всегда хотите видеть дополнительную информацию при тестировании, но не хотите удалять все vardumps перед развертыванием на сервере.

Я также делаю такие вещи, как проверка IP-адреса клиента и отображение ошибоки информация о реальном производственном сервере, а также, если IP-адрес клиента мой.

function getIp()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
    {
        $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
    {
        $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
        $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

function onTestClient(){
    $office_ip = "xxxx.xxxx.xxxx.xxxx";
    $test_client_ips = array($office_ip,"any other ip you want");
    $client_ip = getIp();
    if (in_array($client_ip,$test_client_ips)) return true;
    return false;
}

Может быть очень удобно, если вам нужно протестировать некоторые быстрые обновления на живом сайте с удобного компьютера без локального тестированиясреда для использования.Можно просто добавить свой текущий IP-адрес в список и использовать функции, подобные этой:

function die_dev($message){
    if (onTestServer() || onTestClient()) die($message);
}

Или даже:

if (onTestClient()){
    //show a completely different interface/webpage html js etc
} else {
    //show the original content that is currently live
}
1 голос
/ 29 октября 2014

Поскольку у самого непристойного ответа есть недостатки безопасности, позвольте мне включить менее рискованную версию из php.net .

define ('DEBUG', 1);
if (DEBUG == 1) {
   // echo some sensitive data.
}

Основы те же, но этот не будет выполнять код отладки, если константа DEBUG не объявлена.

Проблема с if (DEBUG) состоит в том, что если константа не определена, она примет строку «DEBUG», которая оценивается как true.

1 голос
/ 09 декабря 2010

Это происходит реже, если вы используете языковые функции, предназначенные для отладки:

 assert( is_string($param1) );

Не повредит производственный код.

0 голосов
/ 04 октября 2014

Я только собираюсь упомянуть об этом, так как никто не пошел туда.

Если вы не пишете какой-либо код отладки, тогда код отладки не попадет в производство.

Если вы пишете «код отладки», это говорит о том, что вы на самом деле плохо понимаете свой код. Может быть, это слишком сложно.

Сначала напишите свои юнит-тесты. Эта практика приведет к лучшему дизайну. Убедитесь, что у вас есть полное покрытие кода. Тестируйте случаи, которые трудно реализовать - не удается получить сокетное соединение, база данных недоступна и т. Д. Пишите регрессионные тесты. Не размещайте ничего, что не может их пройти. Любой отчет об ошибке должен быть преобразован в регрессионный тест до изменения кода. Регрессионный тест должен провалиться - и быть единственным тестом, который не прошел. Исправьте ошибку.

Автоматизация компиляции и тестирования. Если вы действительно пишете код отладки, он должен быть удален сразу после успешного тестирования. Когда ваша организация станет действительно зрелой, возможно, вы даже автоматизируете развертывание.

0 голосов
/ 04 октября 2014

Мой рекомендуемый способ отладки PHP-кода даже в производственном режиме.

  1. Зарегистрируйтесь бесплатно и создайте приложение на http://todell.com/debug

  2. Отладка вашего PHP-кода, как это

    определить ( "DEBUG_LVL", 1); / * Поместите это в любое удобное для редактирования место или в один файл, который был включен во все ваше веб-приложение. * /

    if (DEBUG_LVL> 0) file_get_contents ( "http://todell.com/w/y///".urlencode(json_encode($object))."/".LINE."/".urlencode(FILE)."/".$_SERVER["REMOTE_ADDR"]);

Где $ object - объект, который вы хотите отправить в ваше приложение отладки. это может быть что угодно, исключение, выбрасываемое из вашего кода или сравнительные данные. Предел размера $ объекта составляет 64 КБ Это не ограничено только языком PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...