【问题标题】:How to debug perl within a bash wrapper如何在 bash 包装器中调试 perl
【发布时间】:2011-11-27 15:53:22
【问题描述】:

我正在调试一个由 bash 脚本启动的 Perl 程序。因为 Perl 脚本由大量 Perl 模块组成,需要提供极其复杂的选项,所以这里的 bash wrapper 是绝对有必要的。

由于这个限制,就我而言,我不能使用 Perl 调试器,这是我猜想的最简单的方法。然后我转向老好printf。但是,即使我将printfs 从一个位置添加到不同模块中的另一个位置,实际上也不会将任何内容打印到我启动 bash 包装器的终端。

所以,我希望您先解释一下为什么我无法从 Perl 脚本内部获取任何打印信息,以及在这种情况下如何解决我的问题以调试 Perl 程序。

【问题讨论】:

  • “因为 perl 脚本包含大量的 perl 模块,并且需要提供极其复杂的选项,所以这里的 bash 包装器绝对是必要的”——这不符合。 Perl 不缺少解析命令行选项或呈现 UI 的工具,也不缺少用于编写处理 CPAN 依赖项的安装程序的系统。
  • @Quentin:问题是没有人想在每次运行时在命令行中手动提供选项列表,所以我们需要一个包装器来以某种方式在大多数情况下进行硬编码选项。但你是对的,包装器不必是 bash,完全同意。
  • 但我们现在不是在谈论“每次运行”,而是在谈论“单次调试运行”。找出包装器如何调用您的 perl 程序,然后使用额外的 -d 开关以这种方式调用它。

标签: perl bash


【解决方案1】:

解释为什么我无法从内部 perl 脚本中获取任何打印信息

大概你的 bash 脚本正在吞噬输出。

弄清楚 bash 正在做什么,并使用相同的参数和环境变量直接调用 perl。

【讨论】:

    【解决方案2】:

    快速 Bash 破解

    应该可以将STDOUTSTDERR重定向到文件:

    # Inside the bash script
    perl myScript.pl 1>perl_log.out 2>perl_log.err
    

    快速 Perl 破解

    滚动一个 sub 以打印调试输出:

    use constant debug_flag => 1; # At top of script(s)
    
    {  my $debug_handle;
    
        sub debug {
    
            return unless debug_active;  # Only prints debug msgs if debug active
    
            unless ( $debug_handle ) {   # Initialize debug log
    
                open $debug_handle, '>', 'perl_log.out' or die $!;
            }
    
            print $debug_handle @_, "\n";
        }
    }
    
    # call with 'debug'
    
    debug ( 'Array length : ', scalar @array );
    

    Perl 最佳实践

    use Log::Log4perl;  # Wonderful logging module
    

    use Carp;
    local $SIG{__DIE__} = \&Carp::confess;  # Print out stack traces...
    local $SIG{__WARN__} = \&Carp::cluck;   # ... when using die and warn
    

    质量

    最好avoid printf whenever possible and use print instead

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多