2013-05-25 3 views
3

Я новичок в Perl, и у меня есть следующая проблема.
У меня есть выход журнала, и я нашел, откуда этот выход журнала. Я имею в виду подпрограмму в каком-то модуле, который ее печатает.Рабочий процесс для отладки для программиста Perl

Теперь, например, в Java через Eclipse Я бы использовал, например. Call hierarchy и другие утилиты, чтобы узнать, как/когда/кто вызывает этот метод, и выяснить, как воспроизводить то, что мне нужно, и отлаживать.

Как это сделать в Perl? Через, например, grep? Если I grep, например. для имени модуля я получаю hundrends линий, начиная от use Arequire AC::B::AB::AC::B::A::some_routineC::B::A::some_other_routine и т.д.
На вершине этого я боюсь, что, возможно, рутина меня интересует не вызываются непосредственно, но некоторые сценарии, например, запускает модуль, который представляет интерес для меня через некоторые неясные (для меня из-за моего невежества в Perl).

Так как же я могу отлаживать что-то в Perl самым эффективным способом? Что вы предлагаете мне, чтобы сделать и стать более эффективными?

+0

Если у вас есть EPIC IDE для Eclipse, то вы можете установить точка останова в подпрограмме обычным способом. Вы можете увидеть стек вызовов оттуда, как только программа будет приостановлена. – Borodin

ответ

5

Запуск программы под управлением отладчика Perl:

perl -d scriptname arguments... 

Установить точку останова в функции вы заботитесь о, и когда программа останавливается в точке останова используйте команду T отладчик для отображения трассировки стека, который будет показать, откуда была вызвана функция.

Из ваших комментариев, я не уверен, что это действительно касается того, что вы ищете. Может быть, что вы хотите, это перекрестная ссылка на приложение Perl? См. Часто задаваемые вопросы How do I cross-reference my Perl programs?

+0

+1. Я не знаю, где начинается программа. Я имею в виду, что в 'Java' или' C++ 'нет' main'. С моей (неосведомленной) перспективы у меня есть много сценариев, которые могли бы вызвать модуль, и я действительно не знаю, что такое поток. Что я говорю, имеет смысл? – Cratylus

+0

Perl-программы - это скрипты, поэтому они начинаются с кода верхнего уровня, не содержащегося в каких-либо определениях функций. – Barmar

+0

Требует ли «perl -d» графическая среда? – Cratylus

4

В большинстве случаев получение трассировки стека (наряду с некоторой информацией об отладке) является хорошим началом. Можно использовать стандартный Carp модуль для создания трассировки стека:

use Carp; 
print_to_log(Carp::longmess("We're here")); 

Или есть более object-oriented module для этого, как хорошо.

+0

Значит, вы хотите изменить скрипт, чтобы добавить «Карп»? – Cratylus

+0

Не скрипт, а модуль, содержащий интересующую функцию. – Dallaylaen

4

Чтобы получить дамп стека вызовов без изменения кода, вы можете использовать PERL командной строки для запуска программы под Carp::Always:

perl -MCarp::Always my_program.pl 
+0

Я получаю 'Не могу найти Carp/Always.pm в @INC' – Cratylus

+1

@Cratylus вам может потребоваться установить модуль из CPAN, тогда см. 'Man cpan' (я предполагаю, что он поставляется с Perl) или [cpanminus] (http : //search.cpan.org/perldoc приложение% 3A% 3Acpanminus). См. Также [это обсуждение] (http://stackoverflow.com/questions/5861292/which-cpan-installer-is-the-right-one-cpan-pm-cpanplus-cpanminus) – Dallaylaen

Смежные вопросы