有两种情况我的代码不会导致 segmentation fault :
我已经追踪到这个电话:
$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;
}
我在这方面浪费了一些时间。
编辑
我有其他模块使用此功能,有些希望能够使用
$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/