Jak mogę rozwiązać problem ze skryptem CGI Perla?

Mam skrypt Perla, który nie działa i nie wiem jak zacząć zawężać problem. Co mogę zrobić?


Uwaga: dodaję pytanie, ponieważ naprawdę chcę dodać moją bardzo długą odpowiedź do Stackoverflow. Ciągle linkuję do niego w innych odpowiedziach i zasługuje na to, by tu być. Nie wstydź się edytować mojej odpowiedzi, jeśli masz coś do dodania.

 96
Author: brian d foy, 2010-01-29

8 answers

Ta odpowiedź jest przeznaczona jako ogólne ramy do pracy przez problemy ze skryptami CGI Perla i pierwotnie pojawiły się na Perlmonks jako Rozwiązywanie problemów ze skryptami CGI Perla. Nie jest to kompletny przewodnik po każdym problem, który możesz napotkać, ani samouczek na temat usuwania błędów. Informatyka jest tylko zwieńczeniem mojego doświadczenia debugowania skryptów CGI dla dwudziestu (plus!) lat. Ta strona wydaje się mieć wiele różnych domów, i wydaje zapomnieć, że istnieje, więc dodaję ją do StackOverflow. Ty wszelkie uwagi lub sugestie można przesyłać do mnie na [email protected]. to także community wiki, ale nie szalej. :)


Czy używasz wbudowanych funkcji Perla, aby pomóc Ci znaleźć problemy?

Włącz ostrzeżenia, aby Perl ostrzegał Cię o wątpliwych częściach kodu. Możesz to zrobić z linii poleceń za pomocą przełącznika -w, więc nie musisz zmieniać żadnego kodu ani dodawać pragmy do każdego pliku:

 % perl -w program.pl

Należy jednak zmusić się do zawsze Wyczyść wątpliwy kod, dodając warnings pragma do wszystkich plików:

 use warnings;

Jeśli potrzebujesz więcej informacji niż krótki komunikat ostrzegawczy, użyj diagnostics pragma, aby uzyskać więcej informacji, lub zajrzyj doperldiag dokumentacja:

 use diagnostics;

Czy najpierw wypisałeś poprawny nagłówek CGI?

Serwer oczekuje, że pierwszym wyjściem ze skryptu CGI będzie nagłówek CGI. Zazwyczaj może to być tak proste jak print "Content-type: text/plain\n\n"; lub z CGI.pm i jego pochodne, print header(). Niektóre serwery są wrażliwe na wyjście błędu (na STDERR) pojawiające się przed standardowym wyjściem (na STDOUT).

Spróbuj wysłać błędy do przeglądarki

Dodaj ten wiersz

 use CGI::Carp 'fatalsToBrowser';

Do twojego scenariusza. To również wysyła błędy kompilacji do okna przeglądarki. Pamiętaj, aby to usunąć przed przejściem do środowiska produkcyjnego, ponieważ dodatkowe informacje mogą stanowić zagrożenie dla bezpieczeństwa.

Co mówi dziennik błędów?

Serwery przechowują dzienniki błędów (lub powinno, przynajmniej). Wyjście błędu z serwera i ze skryptu powinno pokaż się tam. Znajdź dziennik błędów i zobacz, co mówi. Nie ma standardowego miejsca na pliki dziennika. Zajrzyj do konfiguracji serwera dla ich lokalizacji, lub zapytać serwer admin. Możesz również użyć narzędzi takich jak CGI:: Carp aby zachować własne pliki dziennika.

Jakie są uprawnienia skryptu?

Jeśli widzisz błędy takie jak" Permission denied " lub " Method not zaimplementowane", prawdopodobnie oznacza to, że Twój skrypt nie jest czytelne i wykonywalne przez użytkownika serwera www. Na smaki Unix, zmiana trybu na 755 jest zalecana: chmod 755 filename. Nigdy nie ustawiaj trybu na 777!

Używasz use strict?

Pamiętaj, że Perl automatycznie tworzy zmienne, gdy najpierw ich używaj. Jest to cecha, ale czasami może powoduje błędy, jeśli błędnie wpisujesz nazwę zmiennej. Pragma use strict pomoże Ci znaleźć tego rodzaju błędy. To irytujące, dopóki się do tego nie przyzwyczaisz, ale Twój programowanie znacznie się poprawi po jakimś czasie i będziesz wolny, aby popełniać różne błędy.

Czy skrypt się kompiluje?

Możesz sprawdzić błędy kompilacji za pomocą -c Zamiana. Skoncentruj się na pierwszych zgłoszonych błędach. Płukanie, powtarzam. Jeśli dostajesz naprawdę dziwne błędy, sprawdź upewnij się, że skrypt ma właściwe zakończenia linii. Jeśli FTP w trybie binarnym, checkout z CVS, czy coś innego co nie obsługuje tłumaczenia końca linii, serwer WWW może zobaczyć twój scenariusz to jedna wielka linijka. Przenoszenie skryptów Perla w ASCII mode.

Czy skrypt skarży się na niepewne zależności?

Jeśli twój skrypt narzeka na niepewne zależności, prawdopodobnie używasz przełącznika -T, aby włączyć tryb taint, który jest dobra rzecz, ponieważ utrzymuje, że masz przekazywanie niezaznaczonych danych do powłoki. Jeśli skarży się, że robi swoje, aby pomóc nam pisać bezpieczniejsze Skrypty. Dowolne dane pochodzące spoza programu (tj. środowisko) jest uważany za skażony. Zmienne środowiskowe, takie jak PATH i LD_LIBRARY_PATH są szczególnie kłopotliwe. Musisz ustawić je na bezpieczną wartość lub całkowicie je odłączyć, jak polecam. Powinieneś używać absolute / align = "left" / Jeśli taint checking narzeka na coś innego, upewnij się, że dane zostały usunięte. Zobacz perlsec szczegóły na stronie man.

Co się stanie, gdy uruchomisz go z linii poleceń?

Czy skrypt wyświetla Co oczekujesz, gdy uciekniesz z wiersz poleceń? Jest pierwszym wyjściem nagłówka, a następnie pusta linia? Pamiętaj, że STDERR można łączyć z STDOUT jeśli jesteś na terminalu (np. sesja interaktywna), oraz ze względu na buforowanie może pojawić się w pomieszanej kolejności. Włącz Funkcja autoflush Perla poprzez ustawienie $| na prawdziwa wartość. Zazwyczaj można zobaczyć $|++; w Programy CGI. Po ustawieniu każdy druk i zapis będzie natychmiast przejdź do wyjścia zamiast buforowania. Musisz ustawić to dla każdego filehandle. Użyj select do zmień domyślne Zarządzanie plikami w następujący sposób:

$|++;                            #sets $| for STDOUT
$old_handle = select( STDERR );  #change to STDERR
$|++;                            #sets $| for STDERR
select( $old_handle );           #change back to STDOUT

Tak czy inaczej, pierwszą rzeczą, którą powinien być nagłówek CGI po której następuje pusta linia.

Co się stanie, gdy uruchomisz go z linii poleceń w środowisku podobnym do CGI?

Środowisko serwera www jest zwykle o wiele bardziej ograniczone niż środowisko linii poleceń i posiada dodatkowe informacje o żądaniu. Jeśli twój skrypt działa poprawnie z wiersza poleceń możesz spróbować symulować sieć serwer środowisko. Jeśli pojawi się problem, masz problem ze środowiskiem.

Wyłącz lub usuń te zmienne

  • PATH
  • LD_LIBRARY_PATH
  • wszystkie ORACLE_* zmienne

Ustaw te zmienne

  • REQUEST_METHOD (Ustaw na GET, HEAD, lub POST odpowiednio)
  • SERVER_PORT (ustawione na 80, Zwykle)
  • [13]} (jeśli robisz rzeczy z chronionym dostępem)

Najnowsze wersje CGI.pm (>2.75 ) wymagaj znacznika -debug, aby się stare (użyteczne) zachowanie, więc być może trzeba będzie dodać je do Twój CGI.pm import.

use CGI qw(-debug)

Używasz die() czy warn?

Te funkcje wyświetlają się STDERR, chyba że przedefiniujesz oni. Nie wysyłają też nagłówka CGI. Możesz dostać ta sama funkcjonalność z pakietami takimi jak CGI:: Carp

Co się dzieje po wyczyszczeniu pamięci podręcznej przeglądarki?

Jeśli uważasz, że Twój skrypt robi dobrze, a kiedy wykonujesz żądanie ręcznie dostajesz prawo wyjście, przeglądarka może być winowajcą. Wyczyść pamięć podręczną i ustaw rozmiar pamięci podręcznej na zero podczas testowania. Pamiętaj, że niektóre przeglądarki są naprawdę głupie i nie ładują się ponownie nowe treści, Nawet jeśli każesz mu to zrobić. To jest szczególnie rozpowszechnione w przypadkach, gdy ścieżka URL jest to samo, ale zmienia się treść(np. dynamiczne obrazy).

Czy scenariusz jest tam, gdzie myślisz, że jest?

Ścieżka systemu plików do skryptu nie jest koniecznie bezpośrednio związany ze ścieżką URL do skryptu. Upewnij się masz odpowiedni katalog, nawet jeśli musisz napisać krótki skrypt testowy, aby to przetestować. Ponadto, czy jesteś pewien że modyfikujesz poprawny plik? Jeśli nie widzisz każdy efekt ze swoimi zmianami, może być modyfikowanie inny plik lub wgrywanie pliku w niewłaściwe miejsce. (To jest, nawiasem mówiąc, moja najczęstsza przyczyna takich kłopotów ;)

Czy używasz CGI.pm, lub pochodną to?

Jeśli problem jest związany z parsowaniem wejścia CGI i nie korzystają z szeroko testowanego modułu jak CGI.pm, CGI::Request, CGI::Simple lub CGI::Lite, użyj modułu i zacznij żyć. CGI.pm ma tryb zgodności cgi-lib.pl, który może pomóc rozwiązać wejście problemy spowodowane starszymi implementacjami parsera CGI.

Czy użyłeś ścieżek absolutnych?

Jeśli uruchamiasz zewnętrzne polecenia z system, kleszcze tylne lub inne urządzenia IPC, ty powinien używać bezwzględnej ścieżki do zewnętrznego programu. Nie tylko wiesz dokładnie, co prowadzisz, ale unikaj również problemów z bezpieczeństwem. Jeśli otwierasz pliki do odczytu lub zapisu używają ścieżki bezwzględnej. Skrypt CGI może mieć inne wyobrażenie o aktualnym katalog niż ty. Alternatywnie, można zrobić explicit chdir(), aby umieścić cię we właściwym miejscu.

Sprawdziłeś swoje wartości zwrotne?

Większość funkcji Perla powie Ci, czy zadziałały or not i ustaw $! na porażce. Czy sprawdziłeś Zwraca wartość i sprawdza {[49] } komunikaty o błędach? Sprawdziłeś? $@ jeśli używałeś eval?

Jakiej wersji Perla używasz?

Najnowsza stabilna wersja Perla to 5.28 (lub nie, w zależności od tego, kiedy była ostatnio edytowana). Używasz starszej wersji? Różne wersje Perla mogą mieć różne wyobrażenia o ostrzeżeniach.

Z którego serwera www korzystasz?

Różne serwery mogą działać inaczej w tym samym sytuacja. Ten sam produkt serwerowy może działać inaczej z różne konfiguracje. Dołącz jak najwięcej z tego informacje, jak można w każdym wniosku o pomoc.

Sprawdziłeś dokumentację serwera? [54]}poważni Programiści CGI powinni wiedzieć tyle o serwer jak to możliwe-w tym nie tylko funkcje serwera i zachowania, ale także konfiguracji lokalnej. Na dokumentacja serwera może nie być dostępna jeśli używasz produkt komercyjny. W przeciwnym razie dokumentacja powinna być na twoim serwerze. Jeśli nie, spójrz. za to w sieci.

Czy przeszukałeś archiwa comp.infosystems.www.authoring.cgi?

to się przyda, ale wszystkie dobre plakaty albo zginęły, albo zniknęły.

Jest prawdopodobne, że ktoś miał twój problem wcześniej, i że ktoś (być może ja) na to odpowiedział w tym grupa dyskusyjna. Chociaż ta grupa dyskusyjna przeszła swój rozkwit, zebrana mądrość z przeszłość może być czasem przydatna.

Czy możesz odtworzyć problem krótkim skryptem testowym?

W dużych systemach może być trudno wyśledzić błąd skoro tak wiele się dzieje. Spróbuj odtworzyć problem zachowanie z możliwie najkrótszym skryptem. Znając problem to większość rozwiązania. Może to być z pewnością czasochłonne, ale ty nie znalazłem jeszcze problemu i kończą ci się opcje. :)

Czy zdecydowałeś się pójść do film?

Poważnie. Czasami możemy się tak zaplątać w problem, że rozwijać "zwężenie percepcyjne" (widzenie tunelowe). Przerwa, wypicie filiżanki kawy lub wysadzenie kilku złych facetów w [Duke Nukem,Quake,Doom,Halo, COD] może dać ci świeża perspektywa, że trzeba ponownie podejść do problemu. Czy wokalizowałeś problem? Znowu poważnie. Czasami wyjaśniając problem na głos prowadzi nas do własnych odpowiedzi. Talk to the penguin (pluszowa zabawka) ponieważ twoi współpracownicy nie słuchają. Jeśli jesteś zainteresowany tym jako poważne narzędzie do debugowania (i polecam je, jeśli nie znaleźć problem już teraz), możesz również przeczytać Psychologia programowania komputerowego .
 121
Author: brian d foy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-02 04:17:38

Myślę, że CGI::Debug Warto również wspomnieć.

 10
Author: Mikael S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-29 22:48:21

Zastanawiam się, dlaczego nikt nie wspomniał o opcji PERLDB_OPTS o nazwie RemotePort; chociaż, co prawda, w sieci nie ma zbyt wielu działających przykładów (RemotePort nie jest nawet wspomniane w perldebug {58]}) - i było dla mnie trochę problematyczne, aby wymyślić ten, ale oto idzie (jest to przykład Linuksa).

Aby zrobić odpowiedni przykład, najpierw potrzebowałem czegoś, co może wykonać bardzo prostą symulację serwera CGI, najlepiej za pomocą pojedynczej linii poleceń. Po znalezieniu proste web serwer wiersza poleceń do uruchamiania cgis. (perlmonks.org) , znalazłem IO:: All-a Tiny Web Server do zastosowania w tym teście.

Tutaj będę pracował w katalogu /tmp; skrypt CGI będzie /tmp/test.pl (dołączony poniżej). Zauważ, że Serwer IO::All będzie obsługiwał tylko pliki wykonywalne w tym samym katalogu co CGI, więc chmod +x test.pl jest tutaj wymagane. Tak więc, aby wykonać zwykły test CGI, zmieniam katalog na /tmp w terminalu i uruchamiam jednoliniowy serwer WWW tam:

$ cd /tmp
$ perl -MIO::All -e 'io(":8080")->fork->accept->(sub { $_[0] < io(-x $1 ? "./$1 |" : $1) if /^GET \/(.*) / })'

Polecenie webserver zablokuje się w terminalu, a w przeciwnym razie uruchomi serwer lokalnie (na 127.0.0.1 lub localhost) - następnie mogę przejść do przeglądarki internetowej i poprosić o ten adres:

http://127.0.0.1:8080/test.pl

... i powinienem obserwować printS wykonane przez {[20] } są ładowane - i wyświetlane-w przeglądarce internetowej.


Teraz, aby debugować ten skrypt za pomocą RemotePort, najpierw potrzebujemy listener w sieci, za pomocą którego będziemy wchodzić w interakcję z Perlem debuggera; możemy użyć narzędzia wiersza poleceń netcat (nc, widziałem to tutaj: Perlremremote Debug?). Tak więc najpierw uruchom netcat listener w jednym terminalu-gdzie będzie blokował i czekał na połączenia na porcie 7234 (który będzie naszym portem debugowania):

$ nc -l 7234

Następnie chcielibyśmy perl rozpocząć w trybie debugowania z RemotePort, gdy test.pl zostanie wywołana (nawet w trybie CGI, przez serwer). W Linuksie można to zrobić za pomocą następującego skryptu "shebang wrapper" - który tutaj również wymaga aby być w /tmp i musi {[75] } być wykonywalne:

cd /tmp

cat > perldbgcall.sh <<'EOF'
#!/bin/bash
PERLDB_OPTS="RemotePort=localhost:7234" perl -d -e "do '$@'"
EOF

chmod +x perldbgcall.sh

To jest trochę trudne-patrz skrypt powłoki - Jak mogę używać zmiennych środowiskowych w moim shebang? - Unix & Linux Stack Exchange . Ale, sztuczka tutaj wydaje się być nie aby rozwidlać perl interpreter, który obsługuje test.pl - więc kiedy go uderzymy, Nie exec, ale zamiast tego wywołujemy perl "po prostu", a w zasadzie "źródło" naszego test.pl skryptu używając do (zobacz Jak uruchomić skrypt Perla z w skrypcie Perla?).

Teraz, gdy mamy perldbgcall.sh w /tmp - możemy zmienić plik test.pl, tak aby odnosił się do tego pliku wykonywalnego w jego linii shebang ( zamiast zwykłego interpretera Perla) - oto /tmp/test.pl zmodyfikowany w ten sposób:

#!./perldbgcall.sh

# this is test.pl

use 5.10.1;
use warnings;
use strict;

my $b = '1';
my $a = sub { "hello $b there" };
$b = '2';
print "YEAH " . $a->() . " CMON\n";
$b = '3';
print "CMON " . &$a . " YEAH\n";

$DB::single=1;  # BREAKPOINT

$b = '4';
print "STEP " . &$a . " NOW\n";
$b = '5';
print "STEP " . &$a . " AGAIN\n";

Teraz, zarówno test.pl, jak i jego nowy handler shebang, perldbgcall.sh, są w /tmp; i mamy nc nasłuchiwanie połączeń debugowania na porcie 7234 - więc możemy wreszcie otworzyć kolejne okno terminala, zmienić katalog na /tmp i uruchomić one-liner serwer WWW (który nasłuchuje połączeń internetowych na porcie 8080):

cd /tmp
perl -MIO::All -e 'io(":8080")->fork->accept->(sub { $_[0] < io(-x $1 ? "./$1 |" : $1) if /^GET \/(.*) / })'

Po tym, możemy przejść do naszej przeglądarki internetowej i zażądać tego samego adresu, http://127.0.0.1:8080/test.pl. Jednak teraz, gdy serwer WWW spróbuje wykonać skrypt, zrobi to poprzez perldbgcall.sh shebang-który uruchomi się perl w trybie zdalnego debuggera. W ten sposób wykonanie skryptu zostanie wstrzymane - a więc przeglądarka internetowa zablokuje się, czekając na dane. Możemy teraz przełączyć się na terminal netcat i powinniśmy zobaczyć znany Perl tekst debuggera-jednak wyjście przez nc:

$ nc -l 7234

Loading DB routines from perl5db.pl version 1.32
Editor support available.

Enter h or `h h' for help, or `man perldebug' for more help.

main::(-e:1):   do './test.pl'
  DB<1> r
main::(./test.pl:29):   $b = '4';
  DB<1>

Jak pokazuje fragment, teraz zasadniczo używamy nc jako "terminala" - więc możemy wpisać r (i wprowadzić) dla "run" - a skrypt uruchomi się wykonując instrukcję breakpoint (Zobacz także w Perlu, jaka jest różnica między $DB::single = 1 i 2?), przed ponownym zatrzymaniem (zauważ, że w tym momencie przeglądarka nadal się zablokuje).

Więc teraz możemy, powiedzmy, przejść przez resztę test.pl, przez nc terminal:

....
main::(./test.pl:29):   $b = '4';
  DB<1> n
main::(./test.pl:30):   print "STEP " . &$a . " NOW\n";
  DB<1> n
main::(./test.pl:31):   $b = '5';
  DB<1> n
main::(./test.pl:32):   print "STEP " . &$a . " AGAIN\n";
  DB<1> n
Debugged program terminated.  Use q to quit or R to restart,
  use o inhibit_exit to avoid stopping after program termination,
  h q, h R or h o to get additional info.
  DB<1>

... jednak również w tym momencie przeglądarka blokuje i czeka na dane. Dopiero po wyjściu z debuggera z q:

  DB<1> q
$

... czy przeglądarka zatrzymuje blokowanie - i na koniec wyświetla (pełne) wyjście test.pl:

YEAH hello 2 there CMON
CMON hello 3 there YEAH
STEP hello 4 there NOW
STEP hello 5 there AGAIN

Oczywiście tego rodzaju debugowanie można wykonać nawet bez uruchamiania serwera www - jednak najciekawsze jest to, że w ogóle nie dotykamy serwera www; uruchamiamy wykonywanie "natywnie" (dla CGI) z przeglądarki internetowej - i jedyną potrzebną zmianą w samym skrypcie CGI jest zmiana shebang (i oczywiście obecność shebang wrapper script, jako pliku wykonywalnego w tym samym katalogu).

Mam nadzieję, że to komuś pomoże - na pewno chciałbym się na to natknąć, zamiast pisać to sam.]} Zdrowie!
 8
Author: sdaau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:31

Czy używasz obsługi błędów podczas debugowania?

die wypowiedzi i inne fatalne błędy w czasie wykonywania i kompilacji drukowane do STDERR, które mogą być trudne do znalezienia i mogą być łączone z wiadomości z innych stron internetowych na twojej stronie. Podczas debugowania swojego skrypcie, dobrym pomysłem jest wyświetlanie komunikatów o błędach krytycznych w Twoim przeglądarka jakoś.

Jednym ze sposobów na to jest wywołanie

   use CGI::Carp qw(fatalsToBrowser);

Na górze skryptu. że wywołanie zainstaluje obsługę $SIG{__DIE__} (Zobacz perlvar) wyświetla błędy krytyczne w przeglądarce, dodając w razie potrzeby poprawny nagłówek. Kolejna sztuczka z debugowaniem CGI, której użyłem, zanim usłyszałem o CGI::Carp, to użyj eval z obiektami DATA i __END__ w skrypcie, aby wychwycić błędy w czasie kompilacji:

   #!/usr/bin/perl
   eval join'', <DATA>;
   if ($@) { print "Content-type: text/plain:\n\nError in the script:\n$@\n; }
   __DATA__
   # ... actual CGI script starts here

Ta bardziej słowna technika ma niewielką przewagę nad CGI::Carp, ponieważ wychwytuje więcej błędów w czasie kompilacji.

Update: nigdy nie używałem to, ale wygląda na to, że CGI::Debug, jako Mikael S sugerowane, jest również bardzo przydatne i konfigurowalne narzędzie do tego celu.

 7
Author: mob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-10 16:41:45

Dla mnie używam log4perl . Jest to bardzo przydatne i łatwe.

use Log::Log4perl qw(:easy);

Log::Log4perl->easy_init( { level   => $DEBUG, file    => ">>d:\\tokyo.log" } );

my $logger = Log::Log4perl::get_logger();

$logger->debug("your log message");
 5
Author: zawhtut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-20 06:25:25

Szczerze, możesz zrobić wszystkie fajne rzeczy powyżej tego posta. Chociaż najprostszym i najbardziej proaktywnym rozwiązaniem, jakie znalazłem, było po prostu "wydrukować".

W przykładzie: (Kod normalny)

`$somecommand`;

Aby sprawdzić, czy robi to, co naprawdę chcę, aby zrobił: (Trouble shooting)

print "$somecommand";
 1
Author: Ilan Kleiman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-05 01:40:36

Prawdopodobnie warto również wspomnieć, że Perl zawsze powie Ci, w jakiej linii wystąpił błąd, gdy wykonasz skrypt Perla z linii poleceń. (Na przykład sesja SSH)

Zwykle to zrobię, jeśli Wszystko inne zawiedzie. SSH na serwer i ręcznie wykonam skrypt Perla. Na przykład:

% perl myscript.cgi 

Jeśli jest problem, to Perl powie Ci o nim. Ta metoda debugowania usuwa wszelkie problemy związane z uprawnieniami plików lub przeglądarką internetową lub siecią problemy z serwerem.

 1
Author: gpowr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-05 15:09:21

Możesz uruchomić skrypt CGI Perla w terminalu używając poniższego polecenia

 $ perl filename.cgi

Interpretuje kod i dostarcza wynik kodem HTML .zgłosi błąd, jeśli taki istnieje.

 0
Author: D.Karthikeyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-05 13:57:30