Используется практически всеми скриптами NoDeny и предназначен для ведения логов и вывода отладочных сообщений. Загружается самым первым, чтобы в случае критической ошибки, вывести ее в удобном и понятном виде.
Вначале вам не обязательно знать все нюансы этого модуля, фактически в 99% случаев вы будете его использовать так:
debug('Сообщение');
В админке это сообщение появится в debug-области и будет доступно при нажатии на кнопку Debug под эмблемой сети.
    debug('Запускаем проверку балансов');
    debug('error', 'Ошибка!');
    debug('warn', "Предупреждение. У клиента uid = $uid отрицательный баланс");
    debug('Dump переменной $obj: ', $obj, ' - вот так!');
    debug(\%hash);
В примерах мы посылаем сообщения в основной Debug. Если необходимо вести несколько debug-ов/логов (врядли вам понадобится) - необходимо создать отдельный debug-объект:
    my $debug1 = Debug->new;
    my $debug2 = Debug->new;
    $debug1->add('start');
    $debug2->add('creating connection');
    $debug2->add('connection object info:', $connection);
Debug может работать в 3 режимах: web, консоль и файл. По умолчанию включен web-режим. В этом режиме данные сохраняются внутри debug-объекта и никуда не выводятся. Вывод осуществляется по команде:
    my $html = Debug->show;
Этим произойдет формирование html-фрагмента с текущим debug.
В NoDeny web-интерфейсе debug включен всегда. По мере выполнения скриптов он заполняется данными. По завершению выполнения, debug либо уничтожается либо рендерится (Debug->show) и посылается суперадминистратору. Несмотря на то, что для не суперадминистратора debug уничтожается, он все равно ведется, чтобы в случае критической ошибки все события были записаны в файл для дальнейшего изучения суперадминистратором. В этом случае web-интерфейс поступает подобным образом:
    Debug->param( -type=>'file', -file=>$cfg::debug_log, -nochain=>0 );
    Debug->show; # весь накопленный debug выводим в файл
Параметры Debug объекта, задаются методом param либо при создании объекта методом new:
    -type       : тип debug (file/console/web)
    -file       : имя файла для -type = file
    -drop_chain : 1 - не выводить цепочку подпрограмм для каждого сообщения (только для -type = file/console )
    -only_log   : 1 - заставит вести дебаг только при вызове подпрограммы tolog(), debug() будет игнорироваться
Для демонстрации, создайте файл ping.pl, вставьте в него следующий код и запустите на выполнение:
    use Debug;
    # set 0 for datail log
    my $mode = 0;
    my $log = Debug->new(
        -type       => 'file',
        -file       => 'debug.txt',
        -drop_chain => $mode,
        -only_log   => $mode,
    );
    $log->tolog('ping start');
    $log->debug("ping:", `ping -c3  127.0.0.1`);
    $log->tolog('ping end');
Результат смотрите в файле debug.txt.
С момента установки type = file/console, все последующие данные автоматически выводятся в файл/консоль, т.е. метод show вызывать не требуется.
В методах debug/tolog/add/insert первым параметром может идти одно из зарезервированных слов:
    error   : данное сообщение описывает ошибку
    warn    : данное сообщение описывает предупреждение
    pre     : сохранить форматирование
    head    : сообщение является заголовком
В случае 'error', debug-объект увеличивает свой внутренний счетчик ошибок:
    ....
    $error_msg && debug('error', $error_msg);
    ....
    $error_msg && debug('error', $error_msg);
    ....
    if( Debug->errors > 0)
    {   # произошло Debug->errors ошибок
        rollback;
    }
Html, полученный методом show, содержит css стили, а также уникальны идентификаторы DOM, т.е допускается вывод нескольких debug в один html.
Дебаг в web-режиме обнулятся после накопления 1000 сообщений.
Для переключения дебага в многопоточный режим, необходимо использовать метод threaded:
use threads;
use threads::shared;
use Debug;
Debug->param( -type=>'console' );
Debug->threaded;
threads->create( \&thread1 )->join();
threads->create( \&thread2 )->join();
sub thread1
{
   debug("thread 1: $_"), sleep 1 foreach( 1..3);
}
sub thread2
{
   debug("thread 2: $_"), sleep 1 foreach( 1..3);
}
Модуль debug-а предоставляет некоторые полезные возможности, например, формирование дампа переменных/объектов:
    use Debug;
    my $obj = { one =>  1, two => 2 };
    my $dump = Debug->dump( $obj );
    print $dump."\n";
Debug->dump использует Data::Dumper, т.е. вы можете не подгружать Data::Dumper явно через use, а использовать Debug.