Отладка Perl-скрипта - PullRequest
       39

Отладка Perl-скрипта

2 голосов
/ 19 февраля 2012

Я не знаю Perl, но мне нужно отладить скрипт Perl, который необходим приложению, которое я использую, вот ошибка, которую я получаю:

Unable to recognise encoding of this document at /usr/lib/perl5/vendor_perl/5.8.8/XML/SAX/PurePerl/EncodingDetect.pm line 9

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

package XML::SAX::PurePerl; # NB, not ::EncodingDetect!

use strict;

sub encoding_detect {
    my ($parser, $reader) = @_;

    my $error = "Invalid byte sequence at start of file";
    my $data = $reader->data;
    if ($data =~ /^\x00\x00\xFE\xFF/) {
        # BO-UCS4-be
        $reader->move_along(4);
        $reader->set_encoding('UCS-4BE');
        return;
    } .. tons of if else statements

    warn("Unable to recognise encoding of this document");
    return;

Я проверил, но у этого объекта чтения нет имени или атрибута пути.У меня есть контроль над этим сценарием, поэтому я могу изменить его при необходимости.Любая помощь приветствуется.

Редактировать: Я отследил проблему до этой строки в приложении, которое я пытаюсь использовать:

my @array = SystemImager::HostRange::expand_groups($clients);

Ответы [ 2 ]

2 голосов
/ 19 февраля 2012

Если вы используете модуль Carp и метод confess, вы получите обратную трассировку стека:

use Carp;

confess "Something went horribly wrong" if ($something == $wrong);

Это наиболее полезно внутри функции (в модуле), но это помогает. Тем не менее, это звучит так, как будто об ошибке сообщается кодом, который вы используете, поэтому вы, возможно, не сможете получить ее до croak, но вам следует прочитать руководство для Carp, которое говорит частично:

Форсирование стека

В качестве средства отладки вы можете заставить Карпа рассматривать квака как признание, а карпа - как удар по всем модулям. Другими словами, вынуждайте детализировать трассировку стека. Это может быть очень полезно при попытке понять, почему или откуда генерируется предупреждение или ошибка.

Эта функция активируется путем «импорта» несуществующего символа «подробный». Как правило, вы можете включить его, сказав

perl -MCarp=verbose script.pl

или включив строку -MCarp = verbose в переменную окружения PERL5OPT.

В качестве альтернативы [iv] вы можете установить для глобальной переменной $ Carp :: Verbose значение true.


В соответствии с предложением daxim в комментарии также рассмотрите Carp::Always:

use Carp::Always;

заставляет каждые warn() и die() громко жаловаться в вызывающем пакете и в других местах. Чаще всего используется в командной строке:

perl -MCarp::Always script.pl

Чистая реализация Perl XML::SAX::PurePerl помечена как «медленная» его сопровождающим. Возможно, вам стоит взглянуть на использование одного из многих других SAX-модулей на основе XS, особенно того, который обеспечивает автоматическое обнаружение кодировки.

1 голос
/ 19 июня 2016

Для отладки скрипта Perl вы можете использовать:

perl -d:DebugHooks::Terminal script.pl

Посмотрите на это

...