nytprofhtml 似乎忽略了名为 DB 的模块
Posted
技术标签:
【中文标题】nytprofhtml 似乎忽略了名为 DB 的模块【英文标题】:nytprofhtml seem to ignore module named DB 【发布时间】:2018-02-05 18:52:41 【问题描述】:我正在尝试分析一个包含创造性地命名为DB
的模块的大型应用程序。在-d:NYTProf
下运行它并调用nytprofhtml
之后,都没有任何额外的开关或相关的环境变量,我得到了带有HTML 输出的通常nytprof
目录。但是,由于某些内部逻辑,与我的模块DB
相关的任何输出似乎都被严重损坏了。只是为了确保DB
是纯 Perl。
-
顶部和所有子程序列表:虽然其他函数链接指向相关的
-pm-NN-line.html
文件,但从DB
指向子程序的链接指向入口脚本。
“源代码文件”部分中的“行”链接确实指向 DB-pm-NN-line.html
并且它确实存在,但与所有其他文件不同,它内部没有“语句”表,“行”表绝对没有代码,只是调用的摘要。
其实,这里有一个小例子:
# main.pl
use lib '.';
use DB;
for (1..10)
print DB::do_stuff();
# DB.pm
package DB;
sub do_stuff
my $a = 1;
my $b = 2;
my $c = $a + $b;
return $c;
1;
尝试运行perl -d:NYTProf main.pl
,然后运行nytprofhtml
,然后检查nytprof/DB-pm-8-line.html
。
我不知道这是否会发生,因为 NYTProf 本身有一个名为 DB
的内部模块,或者它以某种神奇的方式处理以 DB 开头的模块 - 我注意到来自 DBI
的函数的输出看起来也有些不同。
除了重命名我的DB
模块之外,有没有办法更改/禁用此行为?
【问题讨论】:
参见DB - programmatic interface to the Perl debugging API
perldoc.perl.org/DB.html - 它是 NYTProf 可能使用的核心模块。最好重命名你的模块
对于接近 10Mb 的代码库以及非常复杂的继承和动态加载,这几乎不是一个选项。无论如何,这个名字是非常通用的,这正是它预计会在野外遇到的原因,所以如果 D::NYTP 有它的 msihandling 硬编码 - 那真的很糟糕。
DB 不仅仅是一个随机模块,它实际上是核心语言的一部分,例如strict
或IO::Handle
。 NYTProf 有权使用该基础设施。是的,您的模块通常可以工作,但是这种命名冲突与创建名为print
、select
或say
的子例程有类似的问题。重命名模块是最明智的选择,并且应该可以通过一些正则表达式进行管理。我通常通过在某些唯一标识符下命名内部模块来防止此类问题,例如喜欢AMON::DB
。
【参考方案1】:
这不是一个选择
你真的别无选择。特殊的DB
包和相关的Devel::
命名空间被编码到perl 编译器/解释器中。除非您想完全不使用任何调试工具并且害怕任何神秘的无法量化的副作用,否则您必须重构代码以重命名您的专有 DB
库
不管怎样,这个名字很笼统,这就是为什么会遇到它的原因
相反,Devel::NYTProf
必然会使用现有的核心包DB
。正是因为它是一个非常通用的标识符,工程师应该拒绝将其作为生产代码的选择,这可能需要在任何时候使用预先存在的第三方代码
一个创造性地命名为
DB
的模块
这掩盖了您自己对选择的支持。 DB
自 2000 年 v5.6 以来一直是核心模块,CPAN 中的任何内容从一开始就应该被排除在外。我确信命名空间的冲突必须在现在之前被发现。请不要成为把问题扫在地毯下的其他人
请记住,就目前而言,您现在放入 DB
包中的任何代码都与 perl 已经放入其中的所有内容共享空间。令人惊讶的是,您还没有出现奇怪和莫名其妙的症状
只要您有一个适合您的 10MB Perl 代码的测试套件,我认为解决这个问题并不算太大的任务。如果你不这样做,那么希望你至少不会再犯同样的错误
【讨论】:
以上是关于nytprofhtml 似乎忽略了名为 DB 的模块的主要内容,如果未能解决你的问题,请参考以下文章