Eclipse не отображает модуль Perl во время отладки (с EPIC)

Я использую Eclipse GALILEO, работающий на Linux Ubuntu с плагином EPIC для запуска/отладки кода Perl, и у меня возникают некоторые проблемы при отладке. Обычно, когда я выполняю пошаговую отладку и встречаю строку, где используется некий Perl-модуль, я нажимаю «Перейти к», после чего просматривается файл модуля, и стрелка отладки также перемещается туда. Теперь кажется, что есть определенные модули, которые не следуют этому сценарию. Вместо этого, когда я нажимаю «Шаг внутрь», запущенный процесс происходит где-то в фоновом режиме. Я имею в виду, что я могу нажать «Шаг через», и я увижу результаты кода, который выполняется, но я не вижу ни сам файл, ни стрелку.

Чтобы сделать это немного яснее, обратитесь к следующему фрагменту кода:

.
.
if (defined($sysname) && $sysname)
{
$sys_manager->setup_from_name($sysname);
$pf_manager->setup_from_name($sysname);
} else {
die "You must give either a --system parameter or an alias name.";
       }
}
.
.

Код от начала до части, показанной выше, можно найти здесь

Я выполняю пошаговую отладку, пока не дойду до строки $sys_manager->setup_from_name($sysname);. Когда я дохожу до него, я нажимаю кнопку «Шаг внутрь» (а не «Шаг вперед»). Затем я ожидаю, что в eclipse откроется еще одно окно, которое переключит представление на модуль, где существует этот метод setup_from_name. Однако, как я упоминал ранее, «стрелка отладки» исчезает. На этом этапе, если я нажму кнопку «Перейти», работа продолжится где-то в фоновом режиме (я вижу, что переменные изменяются). Если я нажму «Шаг возврата», стрелка снова появится и продолжит видимый код.

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

folder A/    #General folder
  folder B/  #Where the scripts which use the above mentioned modules are located
  folder C/  #Where the modules are located

Я надеюсь, что мой вопрос достаточно ясен, однако, если это не так, пожалуйста, прокомментируйте, и я уточню.

ОБНОВЛЕНИЕ Я включил «Консоль отладчика (экспериментальная)» EPIC, и кажется, что когда я достигаю проблемного модуля во время процесса отладки, возникает ошибка. К сожалению, я не могу прочитать и понять эти данные отладчика. Ошибка представляет собой очень длинное сообщение, которое частично вставлено ниже:

S00000003$^AS00000002''NS00000003$^DS000000010NS00000003$^ES0000001b'No such file or directory'NS00000003$^FS000000012NS00000003$^HS00000003256NS00000003$^LS00000003

Полное сообщение об ошибке доступно по этой ссылке.

Может это прольет свет..

ОБНОВЛЕНИЕ 2 Мне предложили проверить, существует ли соответствующий путь к модулю в «Perl Include Path» в свойствах проекта в Eclipse. К сожалению, я сделал это без изменений.


person Eugene S    schedule 19.03.2012    source источник
comment
Покажите какой-нибудь код, для которого это происходит. Если мы не можем воспроизвести неожиданное поведение, мы можем только возьмите дикую массу, догадываясь о том, что не так.   -  person daxim    schedule 19.03.2012
comment
@daxim Добавлен пример кода и дополнительная информация.   -  person Eugene S    schedule 19.03.2012


Ответы (3)


Чтобы использовать библиотеку с относительными путями, я исправил Cwd.pm (снова)... добавил chomp.


sub fast_abs_path {
    local $ENV{PWD} = $ENV{PWD} || ''; # Guard against clobberage
    my $cwd = getcwd();
    require File::Spec;
    my $path = @_ ? shift : ($Curdir ||= File::Spec->curdir);

    # Detaint else we'll explode in taint mode.  This is safe because
    # we're not doing anything dangerous with it
    ($path) = $path =~ /(.*)/s;
    ($cwd)  = $cwd  =~ /(.*)/s;

    chomp($path);  # <<<-- added this chomp here

    unless (-e $path) {

Возможно, в коде EPIC есть исправление получше, грызть перед вызовом fast_abs_path, но лишнее грызть никогда ничему не повредит...

-Дэйвид

person David A    schedule 05.04.2013

Я думаю, что плагин EPIC не может найти этот модуль. Я тут только предполагаю:

Вы правильно установили @INC?

http://www.epic-ide.org/guide/ch03s02.php

Вы установили модуль PadWalker?

http://www.epic-ide.org/guide/ch02s09.php

Вы установили/проверили переменные env PERLLIB/PERL5LIB?

person user1126070    schedule 21.03.2012
comment
Привет и спасибо за ваши комментарии! Дело в том, что остальные модули (по крайней мере, те, с которыми я работал) действительно работают так, как ожидалось. Я имею в виду, что EPIC пропускает соответствующие файлы *.pm во время отладки. Возможно, вы правы в отношении пути. Я постараюсь проверить его в соответствии с конфигурацией по предоставленной вами ссылке и обновить. Спасибо еще раз! - person Eugene S; 21.03.2012
comment
Я попытался добавить путь к модулям в путь включения Perl, как описано в упомянутом вами руководстве пользователя, но, к сожалению, это не помогло. Однако я попытался использовать консоль отладчика EPIC (экспериментальную), и кажется, что есть некоторые ошибки при доступе к проблемным модулям, которые могут иметь значение. Похоже на: NS00000003$^AS00000002''NS00000003$^DS000000010NS00000003$^ES0000001b'No such file or directory'NS00000003$^FS000000012NS00000003$^ Может быть, это даст какую-то подсказку? - person Eugene S; 25.03.2012
comment
Он почему-то не нашел файл модуля. Проверьте, как вызывается этот модуль, чем он отличается от других и как работает. Есть ли использование lib '/somepath', или вы используете FindBin для поиска модуля, или вы используете другой метод для поиска своего модуля? - person user1126070; 26.03.2012
comment
Пожалуйста, покажите нам первую часть скрипта, где вы включаете свой модуль. Из shebang (#!/perl...) использовать строку sys_manager. - person user1126070; 26.03.2012
comment
Пожалуйста, найдите полный код (с самого начала), добавленный в виде ссылки. Спасибо! - person Eugene S; 27.03.2012

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

use lib '..';

Это модуль, который упрощает манипулирование @INC во время компиляции, указывая на модули Perl, которые не расположены по пути по умолчанию (/usr/share/perl/5.10.1/). По какой-то причине эти модули можно было запускать, но я не мог «зайти» в них. Когда я скопировал один из модулей в путь (/usr/share/perl/5.10.1/), я мог выполнить «Шаг внутрь» во время отладки.

Остается только один вопрос: как сделать так, чтобы модули, не расположенные в /usr/share/perl/5.10.1/, были полностью доступны для отладки. Но я предполагаю, что это тема для дополнительного вопроса.

person Eugene S    schedule 08.04.2012
comment
Я сталкиваюсь с этой проблемой довольно часто, и я не знаю, как ее решить. Копирование невидимых модулей в основной каталог проекта не является хорошим решением, это неуклюжий обходной путь. - person Helen Craigman; 17.07.2013