在我的perl脚本(实际上作为守护进程运行)中,我不小心尝试访问之前未定义的数组元素(也是一个数组)。我的脚本此时退出但没有转储任何内核。在这种情况下是否可以转储核心?我尝试通过kill -6命令杀死我的perl进程,在这种情况下生成核心但是当我们从脚本中退出unexpecteldy时,我想在每个实例中生成核心。
my @array = ();
my @a;
@a = @{$array[1]};
答案 0 :(得分:0)
而是生成核心转储或类似内容,我建议您在脚本中记录消息,并在尝试访问不存在的内容时进行一些检查。
perldoc中建议的Using a source level debugger适用于少数情况:
如果-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]};
您也可以在脚本中处理signals。
Perl使用简单的信号处理模型:%SIG哈希包含名称 或用户安装的信号处理程序的参考。这些处理程序会 用一个参数调用,该参数是信号的名称 引发了它。可以有意地从a生成信号 发送给您的特定键盘序列,如control-C或control-Z 从另一个进程,或由内核自动触发时 特殊事件发生,就像孩子进程退出,你自己 进程耗尽堆栈空间或命中进程文件大小 限制。
示例:
$SIG{DIE} = sub { #dump code here };