首先来自命令行的export PERL5OPT=-d:NYTProf
,以便我的调试选项将由子进程继承。然后我启动了我的Perl程序 contactd 。它分叉成为一个守护进程,然后fork / execs另一个Perl程序的九个实例, table_manager 。 (exec看起来像exec /path/to/perl /path/to/table_manager
。)此时我可以看到10个或11个名为 nytprof.out的新文件。 nnnn ;正如预期的那样,现在已经分叉的每个进程都有一个。
客户端连接到已联系哪个fork / execs slave ,后者又连接到九个表管理器并接受来自客户端的请求并将它们传递给九个表管理器。
运行典型的客户端连接后,我关闭了所有服务器进程。我运行 nytprofmerge 将各种 nytprof.out。 nnnn 文件合并到 nytprof-merged.out 中,然后运行nytprofhtml -f nytprof-merged.out --open
。
当HTML报告打开时,除了已联系之外,我没有提及任何内容。顶级子程序主要是BEGIN块,导入, AUTOLOAD ...早期执行的东西。
这让我认为NYTPROF 跨越了一个分支(基于多个nytprof.out文件)但由于某种原因不能继续分析 exec 'ed Perl程序。
我在MacOSX 10.8.2中运行perl 5.16.1和最新的Devel :: NYTProf。
有关我没做过的任何建议吗?
答案 0 :(得分:3)
您可以将fork深度变量设置为-1:
http://search.cpan.org/~timb/Devel-NYTProf-4.25/lib/Devel/NYTProf.pm#forkdepth=N
forkdepth = N
当被分析的perl进程执行fork()子进程时 过程也被分析。 forkdepth选项可用于控制 这个。如果forkdepth为零,则将禁用分析 儿童过程。
如果forkdepth大于零,则将启用分析 子进程和该进程中的forkdepth值是 减一。
如果forkdepth为-1(默认值),那么数字没有限制 被描述的几代儿童。
此致
答案 1 :(得分:0)
AFAIU你忘了要合并的第一个nytprof.out。 你可以合并它,或者你可以通过addpid = 1选项来获得nytprof.out.nnnn,即使是第一次进入。