微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

有两种情况我的代码不会导致 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;
}

>现在我知道我可以用List::MoreUtils::natatime替换each_pair(虽然我听说有一些错误),他们最近才允许这个模块进入我们的环境,我仍然对这个调用导致分段错误的原因感兴趣 – 或者其他Perl程序员由于调试分段错误.

我已经失去了一点时间.

编辑

我有其他模块使用这个函数,有些人希望能够使用$a和$b,也可以在同一个模块的其他地方使用另一个列表.我可以更改它的这个调用,我可以为这个文件更改它,但是为每个成功使用它的地方更改它可能比我在这个晚些时候允许做的更多更改.

解决方法

在Perl中,分段错误非常罕见.我不记得上次遇到一个.

调试器具有足够的干扰性,代码在那里表现不同并不特别令人惊讶,尽管它确实令人沮丧. Smart :: Comments使用源过滤器(我们都知道)是邪恶的.进入Smart :: Comments的源代码,我看到它使用了List :: Util,它通常使用XS实现. List :: Util可能会“修复”您的问题.尝试直接使用List :: Util但不要使用Smart :: Comments.这不会解决任何问题,但可能会将源滤波器的不确定性排除在等式之外.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐