2013-12-23 5 views
6

Ich habe eine Perl-CGI-Anwendung, die manchmal Zeitüberschreitung, wodurch es von Apache und 504 Gateway Time-out Fehler an den Browser gesendet getötet werden verursacht. Ich versuche, diese Anwendung zu profilieren NYTProf verwenden, aber ich kann nicht Profildaten lesen:Profiling ein Perl-CGI-Skript, das Zeitlimit

$ nytprofhtml -f www/cgi-local/nytprof.out 
Reading www/cgi-local/nytprof.out 
Profile data incomplete, inflate error -5 ((null)) at end of input file, perhaps the process didn't exit cleanly or the file has been truncated (refer to TROUBLESHOOTING in the documentation) 

Ich verwende sigexit=1 NYTProf Option. Hier ist minimal CGI-Skript, das Problem reproduziert:

#!/usr/bin/perl -d:NYTProf 

sleep 1 while 1; 

Antwort

6

sigexit=1 Einstellung teilt NYTProf die folgenden Signale zu fangen:

INT HUP PIPE BUS SEGV 

Wenn jedoch Ihr CGI-Skript abläuft, Apache SIGTERM sendet. Sie müssen SIGTERM fangen:

sigexit=term 

Um SIGTERM auf die Standardsignale, die Verwendung zusätzlich zu fangen:

sigexit=int,hup,pipe,bus,segv,term 
1

CGI.pm hat ein debug mode, die Sie verwenden können, Ihr Programm von der Kommandozeile, und geben Sie Ihre CGI-Parameter als Schlüssel/Wert-Paare laufen zu lassen.

Es hat eine andere Funktion, die Sie verwenden können, save your params to a file, und lesen Sie diese Datei später wieder.

Was ich getan habe, ist der Code hinzugefügt, um die Parameter in einer Datei zu speichern, und führen Sie mein Programm über einen Browser. Dadurch kann ich auch sicherstellen, dass der Browser die korrekten Daten sendet.

Dann ändere ich den Code, um die Parameter aus der Datei zu lesen, und führen Sie es so oft wie ich brauche, bis ich alles andere debugged habe.

Sobald Sie das Programm von der Befehlszeile zu Ihrer Zufriedenheit ausgeführt haben, können Sie es über nytprof ausführen, um herauszufinden, was die ganze Zeit dauert.

Verwandte Themen