2013-02-25 53 views
5

首先从命令行输入,这样我的调试选项就会被子进程继承。然后我启动我的Perl程序联系。它分叉成为守护进程,然后fork/execs另一个Perl程序的九个实例,table_manager。 (该执行看起来像exec /path/to/perl /path/to/table_manager。)在这一点上,我可以看到10或11个新文件,称为nytprof.out。 nnnn;正如预期的那样,直到现在,每个过程都有一个分支。在fork/execs程序中使用Devel :: NYTProf

客户端连接到contactd其中叉/高层从属,其又连接到九个表管理者和接受来自客户端的请求,并将它们传递到9个表管理器。

运行典型的客户端连接后,我关闭了所有服务器进程。我运行nytprofmerge合并各种nytprof.out。 nnnn文件分成nytprof-merged.out,然后运行nytprofhtml -f nytprof-merged.out --open

当HTML报告打开时,除了联系我什么也没有看到。顶级子程序大多是BEGIN块,进口,AUTOLOAD ...早期执行的东西。

这使我觉得NYTPROF 去跨fork(基于多个nytprof.out文件),但由于某种原因不能继续来剖析EXEC“编Perl程序。

我在MacOSX 10.8.2中运行perl 5.16.1和最新的Devel :: NYTProf。

对我还没做过的事有什么建议吗?

回答

3

你可以叉深度变量设置为-1:

http://search.cpan.org/~timb/Devel-NYTProf-4.25/lib/Devel/NYTProf.pm#forkdepth=N

forkdepth = N

当正被成形一个perl进程执行一个叉()子 过程是也被剖析。 forkdepth选项可以用来控制 这个。如果forkdepth为零,那么将在子进程 中禁用分析。

如果forkdepth大于零,则会在 子进程中启用概要分析,并且该进程中的forkdepth值将由 减1。

如果forkdepth为-1(默认值),那么对被分析的子代的数量 没有限制。

问候,

+0

我不得不在工作中,在不同的操作系统(CentOS)上尝试这种方式,并且存在一些差异。我必须明确指定* addpid = 1 *选项才能让NYTPROF将pid附加到.out文件。 (这似乎是在我的OSX环境中自动发生的。)我得到了我想要的一切,而没有指定forkdepth = -1(这是默认情况下)。所以今晚我必须在OSX上试试这个,看看指定addpid是否是答案,或者forkdepth是否有所作为。 – Chap 2013-02-25 19:22:40

0

AFAIU您忘记第一nytprof.out合并。 您可以合并它,或者您可以传递addpid = 1选项,即使是第一次输入,也总是可以获得nytprof.out.nnnn。

相关问题