gpt4 book ai didi

perl - 如何在给定的一组模块或 lib 路径中限制 perl 调试?

转载 作者:行者123 更新时间:2023-12-04 19:47:40 25 4
gpt4 key购买 nike

使用 perl -d 调试 perl 程序时, 我怎样才能限制它只进入给定的模块集或到lib 的路径?

最佳答案

DB::cmd_b_sub DB::break_subroutine 函数在任意函数的开头设置断点。您可以遍历 stash 以找到要传递给此函数的参数集。例如,

sub add_breakpoints_for_module {
my $module = shift;
return unless $INC{"perl5db.pl"}; # i.e., unless debugger is on
no strict 'refs';
for my $sub (eval "values %" . $module . "::") {
if (defined &$sub) { # if the symbol is valid sub name
DB::cmd_b_sub(substr($sub,1)); # add breakpoint
}
}
}

此代码应在加载相关模块后运行。

以下是如何将这个想法用作一个单独的库。将此代码保存到 Devel/ModuleBreaker.pm在您的 @INC 上的某处路径并将调试器调用为
perl -d:ModuleBreaker=Some::Module,Some::Other::Module script_to_debug.pl args

.
# Devel/ModuleBreaker.pm - automatically break in all subs in arbitrary modules
package Devel::ModuleBreaker;
sub import {
my ($class,@modules) = @_;
our @POSTPONE = @modules;
require "perl5db.pl";
}
CHECK { # expect compile-time mods have been loaded before CHECK phase
for my $module (our @POSTPONE) {
no strict 'refs';
for my $sub (eval "values %" . $module . "::") {
defined &$sub && DB::cmd_b_sub(substr($sub,1));
}
}
}
1;

这是一个版本,它将在匹配任意模式的子例程上中断(这应该更容易在子模块内中断)。它利用了 %DB::sub表,其中包含有关所有已加载子程序(包括匿名子程序)的信息。
package Devel::SubBreaker;
# install as Devel/SubBreaker.pm on @INC
# usage: perl -d:SubBreaker=pattern1,pattern2,... script_to_debug.pl args
sub import {
my $class = shift;
our @patterns = @_;
require "perl5db.pl";
}
CHECK {
foreach my $sub (keys %DB::sub) {
foreach my $pattern (our @patterns) {
$sub =~ $pattern and DB::cmd_b_sub($sub), last;
}
}
}

关于perl - 如何在给定的一组模块或 lib 路径中限制 perl 调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48229672/

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