6

我有一个 Perl CGI 应用程序有时会超时,导致它被 Apache 杀死,并将504 Gateway Time-out错误发送到浏览器。我正在尝试使用 NYTProf 分析此应用程序,但是我无法读取配置文件数据:

 $ 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)

我正在使用sigexit=1NYTProf 选项。这是重现问题的最小 CGI 脚本:

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

sleep 1 while 1;
4

2 回答 2

7

设置sigexit=1告诉 NYTProf 捕捉以下信号:

INT HUP PIPE BUS SEGV

但是,当您的 CGI 脚本超时时,Apache 会发送SIGTERM. 你需要抓住SIGTERM

sigexit=term

SIGTERM除了默认信号之外,要捕获,请使用:

sigexit=int,hup,pipe,bus,segv,term
于 2013-12-23T17:26:35.033 回答
1

CGI.pm 有一个调试模式,您可以使用它从命令行运行程序,并将您的 CGI 参数作为键/值对传递。

它还有另一个功能,可用于将参数保存到文件中,然后稍后再读回该文件。

我所做的是添加代码以将参数保存到文件中,并通过浏览器运行我的程序。这也有助于我确保浏览器发送正确的数据。

然后我更改代码以从文件中读取参数,并根据需要经常运行它,直到我调试完其他所有内容。

一旦您从命令行运行到您满意的程序,您就可以通过 nytprof 运行它以找出一直占用的时间。

于 2013-12-23T15:55:42.503 回答