如何调试从 PHP 文件调用的 Perl

Posted

技术标签:

【中文标题】如何调试从 PHP 文件调用的 Perl【英文标题】:How to debug Perl that is called from PHP file 【发布时间】:2016-08-17 23:10:27 【问题描述】:

我目前在家工作(周日!),我试图弄清楚为什么我的 Perl 脚本从调用它的地方返回 NULL 到 php。但是,我看不到如何调试 Perl 脚本本身。 PHP 文件返回一个警告,指出我正在尝试对非数组对象执行数组操作(因为预期的数组实际上是 PHP 返回的 NULL)。网络服务器的日志也只记录了这个警告——没有 Perl 错误。

服务器上是否有存储特定“外部”日志的地方?或者,是否有更好的方法来调试从 PHP 文件运行的 Perl 文件,而该 PHP 文件在主 PHP 文件中是必需的?调试不是必需的(我不需要调试模式),但我希望至少看到错误或警告。

【问题讨论】:

能不能改一下Perl脚本的源代码添加一些调试代码? @bart 我确实可以做到。我会写什么? 你能自己运行 Perl 程序而无需中间的 php 吗?你知道什么进去,什么应该出来吗?你有 shell 访问权限吗? @simbabque 不,我只能通过服务器从 PHP 文件运行文件。我没有外壳访问权限。 (否则我会简单地从 shell 运行脚本。) 所以调试器不是一个选项。 answer by bart 是一个好的开始,但了解程序应该做什么也很重要。我认为您也无法安装任何模块,因为您没有外壳访问权限。将@bart 的解决方案与一堆warn 语句结合起来,可能使用Data::Dumper,你应该能够找到问题所在。 【参考方案1】:

您可以在 Perl 脚本的顶部添加以下代码:

sub debug_log

    open my $log_fh, ">>", "/tmp/debug.log";
    print $log_fh $_[0];
    warn $_[0];
    close $log_fh;


$SIG__WARN__ = \&debug_log;
$SIG__DIE__ = \&debug_log;

这样所有警告和die 消息都应该以/tmp/debug.log 结尾。

【讨论】:

tmp 目录是相对于 Perl 文件本身(因此是该脚本的姐妹)、相对于 PHP 文件还是相对于主 PHP 文件?因为乍一看我找不到它。 open 参数指定的路径是绝对路径,因此您应该在/tmp 中有一个文件。如果没有文件,则意味着没有警告或脚本没有死。您可以通过在 $SIG... 行之后使用 warn "debug test"; 来测试是否正确记录了警告。

以上是关于如何调试从 PHP 文件调用的 Perl的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C# 文件调试“调用”Powershell (ps1)

在 perl 中调试由 SWIG 包装的共享库

如何在调试器下运行perl代码块?

如何调试从外部应用程序调用的类库?

Perl程序性能调试之dprofpp

如何在不重新启动的情况下调试 mod_perl2 模块?