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

How to know which line of code was being executed when a signal is received

我正在尝试做这样的事情

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

alarm 10;

# rest of the script

我以ALRM为例,我最终会使用不同的信号从外部杀死来触发它。有做这种操作的巧妙方法吗?

我有一些慢速脚本,有时我想向它们发送信号以了解当时代码的位置。

我想让它尽可能不引人注目,这样我就可以将它打包并添加到遗留代码中。

您可以在列表上下文中使用 caller 来获取调用当前子程序的位置的包、文件和行号。

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

    CORE::say $line;
    die;
};

alarm 2;

while (1) {
    1;
}

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

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

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

    CORE::say $line;
};

warn 'foo';

这将输出 7

请注意,您的代码存在语法错误。您正在指定一个 散列引用 作为信号处理程序, 不是子引用 !