2017-02-09 3 views
7

Ich versuche, so etwas wie dieseWie kann man wissen, welche Codezeile ausgeführt wurde, wenn ein Signal empfangen wird

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

alarm 10; 

# rest of the script 

zu tun, ich bin mit ALRM als Beispiel, werde ich ein anderes Ende mit Signal von außen zu töten, um es auszulösen. Gibt es eine nette Art, diese Art von Operation zu machen?

Ich habe einige langsame Skripte und manchmal würde Ich mag sie ein Signal senden zu wissen, wo der Code in diesem Moment ist.

Ich will das so unauffällig wie möglich machen, damit ich es packen könnte und es zu Legacy-Code hinzufügen.

+5

Es klingt wie Sie Profilierung sind neu zu erfinden. Hast du [Devel :: NYTProf] (https://metacpan.org/pod/Devel::NYTProf) ausprobiert? – AKHolland

+6

Rufen Sie einfach 'Carp :: cluck' im Signalhandler auf und holen Sie sich den gesamten Stack-Trace. – mob

+0

gluck funktioniert auch. Ich hatte versucht, beichten vorher, aber das hat nicht funktioniert, kam mir nicht vor, um Gluckern zu versuchen. – Nullman

Antwort

7

Sie können caller in Listenkontext verwenden Sie die Paket, Datei und die Zeilennummer des Orts, dass die aktuellen Unter aus aufgerufen wurden zu bekommen.

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

    CORE::say $line; 
    die; 
}; 

alarm 2; 

while (1) { 
    1; 
} 

Dies wird Ausgang 11 (wenn ich das richtig in meiner Datei gezählt, es ist 1740, und die $SIG Linie ist 1730

Es funktioniert auch mit anderen Signal-Handler, wie warn.

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

    CORE::say $line; 
}; 

warn 'foo'; 

Dies wird 7 ausgeben

Beachten Sie, dass Ihr Code einen Syntaxfehler aufweist ein Hashreferenz als Signalbehandlungsroutine, nicht Teilreferenz!

+0

Ich habe seit Stunden gegoogelt und irgendwie Anrufer nie aufgetaucht. Genau das habe ich gesucht, danke! welche Hash-Referenz? sub {...} gibt eine Unter Referenz, dieser Code funktioniert für mich – Nullman

+0

@null vielleicht müssen Sie mehr Google foo bekommen :-) Ich dachte zuerst, von '__LINE__' aber das hat offenbar die aktuelle Zeile. Diese Lösung wurde also offensichtlich. – simbabque

+0

ahh, ich sehe meine Frage wurde bearbeitet. Sie haben Recht! Ich habe den "Sub" -Teil verpasst! – Nullman

Verwandte Themen