如何知道收到信号时正在执行哪一行代码

Nul*_*man 7 perl interrupt perl5

我正在尝试做这样的事情

$SIG{ALRM} = sub {
    print $line_number_when_alarm_went_off;
};

alarm 10;

# rest of the script
Run Code Online (Sandbox Code Playgroud)

我正在使用ALRM一个例子,我将最终使用不同的信号从外部杀死以触发它.这种操作有一种巧妙的方法吗?

我有一些慢脚本,有时我想给他们一个信号,知道那时代码在哪里.

我希望尽可能不引人注目,这样我就可以打包并将其添加到遗留代码中.

sim*_*que 7

您可以caller在列表上下文中使用以获取当前子调用的位置的包,文件和行号.

$SIG{ALRM} = sub {
    my ($pkg, $file, $line) = caller;

    CORE::say $line;
    die;
};

alarm 2;

while (1) {
    1;
}
Run Code Online (Sandbox Code Playgroud)

这将输出11(如果我计算正确,在我的文件中它是1740,并且该$SIG行是1730.

它也适用于其他信号处理程序,如warn.

$SIG{__WARN__} = sub {
    my ($pkg, $file, $line) = caller;

    CORE::say $line;
};

warn 'foo';
Run Code Online (Sandbox Code Playgroud)

这将输出 7

请注意,您的代码有语法错误.您将散列引用指定为信号处理程序,而不是子引用!