gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 21:55:13 25 4
gpt4 key购买 nike

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

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com