Как узнать, какая строка кода выполнялась при получении сигнала
Я пытаюсь сделать что-то подобное
$SIG{ALRM} = sub {
print $line_number_when_alarm_went_off;
};
alarm 10;
# rest of the script
Я использую ALRM
в качестве примера, я буду использовать другой сигнал, чтобы убить извне, чтобы вызвать его. Есть ли аккуратный способ делать такого рода операции?
у меня есть несколько медленных сценариев, и иногда я хотел бы отправить им сигнал, чтобы узнать, где находится код в этот момент.
Я хочу сделать это как можно более незаметным, чтобы я мог упаковать его и добавить его в устаревший код.
1 ответов
можно использовать 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
обратите внимание, что ваш код содержит синтаксическую ошибку. Назначении хэш-ссылка в качестве обработчика сигнала, не sub ссылка!