Как узнать, какая строка кода выполнялась при получении сигнала

Я пытаюсь сделать что-то подобное

$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 ссылка!