perl - 在 Perl 中调试段错误有哪些好的方法或步骤?

标签 perl debugging segmentation-fault

有两种情况我的代码不会导致 segmentation fault :

  • 当我使用 Smart::Comments至少在一处
  • 运行调试器。

  • 我已经追踪到这个电话:
    $action->{breakdown} 
        = join( ' '
              ,  each_pair { 
                    my ( $name, $length ) = @_;
                    return "x$length" if $name eq 'FILLER';
                    push @$field_list_ref, $name;
                    return "A$length";
    
                } @$field_def_ref
        );
    

    在哪里 each_pair在另一个模块中定义为:
    sub each_pair (&@) { 
        my $block   = shift;
        return unless @_;
        my $caller  = caller();
        my $aref    = qualify( 'a', $caller );
        my $bref    = qualify( 'b', $caller );
        my @results;
        my $pairs   = 0;
    
        for ( my $index = 0; $index < $#_; $index += 2 ) { 
            $pairs++;
            my @pair                 = @_[$index..($index+1)];
            no strict 'refs';
            local ( $$aref, $$bref ) = @pair;
            push @results, $block->( @pair );
        }
        return wantarray || $pairs != 1 ? @results : shift @results;
    }
    
  • 现在我知道我可以将 each_pair 替换为 List::MoreUtils::natatime (虽然我听说有一些错误),他们最近才允许这个模块进入我们的环境,我仍然对为什么这个调用导致段错误感兴趣——或者其他 Perl 程序员由于调试段错误。

  • 我在这方面浪费了一些时间。

    编辑

    我有其他模块使用此功能,有些希望能够使用$a$b ,它也在同一个模块的其他地方工作,用于另一个列表。我可以更改对它的调用,我可以为这个文件更改它,但是为每个成功使用它的地方更改它,可能比我在这么晚的时间允许做的更改更多。

    最佳答案

    段错误在 Perl 中极为罕见。我不记得我最后一次遇到一个。

    调试器具有足够的侵入性,因此代码在此处的行为会有所不同也就不足为奇了,尽管这肯定令人沮丧。 Smart::Comments使用源过滤器(众所周知)是邪恶的。查看 Smart::Comments 的源代码,我发现它使用 List::Util,它通常使用 XS执行。有可能List::Util是什么“解决”你的问题。尝试使用 List::Util直接但不是Smart::Comments .这不会解决任何问题,但它可能会将源滤波器的不确定性排除在等式之外。

    不幸的是,您的问题似乎不在于代码本身,而在于不同事物之间的意外交互。您不能真正在 Perl 中直接触发段错误。根必须在 perl 本身或 XS 代码中。如果您可以将其减少到一个小而完整的样本,其他人可能能够重现并隔离问题。

    关于perl - 在 Perl 中调试段错误有哪些好的方法或步骤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1172476/

    相关文章:

    python - PYTHONPATH 与 PERL5LIB 的行为

    c - 重新分配和释放原因 "double free or corruption"

    windows - Perl Net::SFTP::Foreign Plink 连接问题

    perl - 我应该如何修改原型(prototype)以允许在 coderef 之后构造散列?

    perl 测试符号函数名是否存在

    visual-studio - 无法在 VS2013 Update 3 中调试 TypeScript 文件

    java - 当 Body 不可分配给类时如何调试 JMS?

    java - API 调试。如何查找函数体之前发生的错误?

    c - 为传递给函数的数组指针初始化内存时出现段错误

    c - 直接返回地址时出现段错误,但通过指针返回地址时没有错误