Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使perl进程转储内核,而不是直接退出进程_Perl_Signals_Core - Fatal编程技术网

使perl进程转储内核,而不是直接退出进程

使perl进程转储内核,而不是直接退出进程,perl,signals,core,Perl,Signals,Core,在我的perl脚本(实际上作为守护进程运行)中,我不小心尝试访问一个以前未定义的数组元素(也是数组)。我的脚本此时退出,但没有转储任何内核。在这种情况下是否可以转储内核?我试图通过kill-6命令终止我的perl进程,在本例中生成核心,但我希望在我们意外退出脚本时在每个实例中生成核心 my @array = (); my @a; @a = @{$array[1]}; 我建议您在脚本中记录消息,并在尝试访问不存在的内容时进行一些检查,而不是生成核心转储或类似的内容 如perldoc中所述,适用于

在我的perl脚本(实际上作为守护进程运行)中,我不小心尝试访问一个以前未定义的数组元素(也是数组)。我的脚本此时退出,但没有转储任何内核。在这种情况下是否可以转储内核?我试图通过kill-6命令终止我的perl进程,在本例中生成核心,但我希望在我们意外退出脚本时在每个实例中生成核心

my @array = ();
my @a;
@a = @{$array[1]};

我建议您在脚本中记录消息,并在尝试访问不存在的内容时进行一些检查,而不是生成核心转储或类似的内容

如perldoc中所述,适用于某些罕见情况:

如果-D的调试输出对您没有帮助,那么是时候采取步骤了 通过使用源代码级调试器执行perl

我们将在这里使用gdb作为示例;这些原则将适用于 任何调试器(许多供应商称其调试器为dbx),但请检查 您正在使用的手册

使用
if
else
可以避免尝试访问不存在的数组位置,例如:

my $wanted_position = 2;

if ( $wanted_position >= @array )
{

    #log a possible error
    #Do something else
}

@a = @{$array[$wanted_position]};
您还可以在脚本内部处理

Perl使用一个简单的信号处理模型:%SIG散列包含名称 或用户安装的信号处理程序的引用。这些处理程序将 用一个参数调用,该参数是 触发了它。可以有意地从信号源生成信号 发送给您的特定键盘序列,如control-C或control-Z 来自另一个进程,或者在 特殊事件发生,就像子进程退出一样,你自己的 进程堆栈空间不足,或达到进程文件大小 限制

例如:

 $SIG{DIE} = sub { #dump code here };

访问未定义的数组元素在Perl中不存在:
Perl-e'print$arr[20];打印“still here”
对我来说仍然没有错误。“dump core”通常不是调试perl脚本的步骤之一。始终获取内容的一种方法是将其放入
END
块中。它在每个
模具
退出时运行。但它可能不够具体。另一种方法是在编写代码时“保护”错误——使用仔细的错误检查。然后,你可以得到非常具体的信息。或者,重写
die
,但为
$SIG{{uuuu die}
的“信号”提供一个钩子(子例程)。例如,请参阅一个调试器,该调试器在十几行代码中对任何
die
启动。