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