2017-02-09 13 views
7

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

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

alarm 10; 

# rest of the script 

Я использую ALRM в качестве примера, я в конечном итоге с помощью другого сигнал, чтобы убить снаружи, чтобы вызвать его. Есть ли опрятный способ сделать такую ​​операцию?

У меня есть несколько медленных скриптов, и иногда я хотел бы отправить им сигнал, чтобы узнать, где код в данный момент.

Я хочу сделать это как можно более ненавязчивым, чтобы я мог его упаковать и добавить в устаревший код.

+5

Похоже, вы изобретаете профилирование. Вы пробовали [Devel :: NYTProf] (https://metacpan.org/pod/Devel::NYTProf)? – AKHolland

+6

Просто вызовите «Carp :: cluck» в обработчик сигнала и получите всю трассировку стека. – mob

+0

cluck действительно работает. я пробовал признаться раньше, но это не сработало, мне не пришло в голову попробовать. – Nullman

ответ

7

В контексте списка вы можете использовать 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

Обратите внимание, что ваш код имеет синтаксическую ошибку. a хеш-ссылка в качестве обработчика сигнала, не подзаголовок!

+0

Я уже много часов гуляю и почему-то звонящий никогда не появлялся. это именно то, что я искал, спасибо! какой хеш-справочник? sub {...} возвращает вспомогательную ссылку, этот код работает для меня – Nullman

+0

@null, возможно, вам нужно получить больше Google foo :-) Я сначала подумал о '__LINE__', но, очевидно, имеет текущую строку. Таким образом, это решение стало очевидным. – simbabque

+0

ahh, я вижу, мой вопрос был отредактирован. Ты прав! я пропустил часть «под»! – Nullman

 Смежные вопросы

  • Нет связанных вопросов^_^