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

时间:2017-03-02 09:43:52

标签: perl signals core

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

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

1 个答案:

答案 0 :(得分:0)

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

perldoc中建议的

Using a source level debugger适用于少数情况:

  

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

     

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

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

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 };