如何知道收到信号时正在执行哪一行代码
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
请注意,您的代码存在语法错误。您正在指定一个 散列引用 作为信号处理程序, 不是子引用 !
我正在尝试做这样的事情
$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
请注意,您的代码存在语法错误。您正在指定一个 散列引用 作为信号处理程序, 不是子引用 !