Frage

Ich bin mit ActivePerl 5.8 unter Windows XP.

use strict;
use warnings;
use Data::Dumper;

Es gibt drei Subroutinen in meinem Skript verwendet wird.

den Call-Stack erkennen, kann ich nur einige print "some location"; einfügen und das Druckergebnis von Konsolenfenster überprüfen.

Gibt es eine gute Methode, um es zu überwachen? Danke.

War es hilfreich?

Lösung

Sie etwa nicht spezifisch waren, warum Sie möchten den Call-Stack überwachen und Ihre subs verfolgen, so Antworten breit sein.

Eine Methode ist, caller :

  

Anrufer

     

Gibt den Kontext des aktuellen Unterprogramm-Aufrufs. Im skalaren Kontext gibt den Paketnamen des Anrufers, wenn ein Anrufer ist, das heißt, wenn wir in einem Unterprogramm oder eval oder erfordern, und die nicht definierten Wert anders sind. Im Listenkontext gibt

# 0         1          2
($package, $filename, $line) = caller;
     

Mit EXPR, es gibt einige zusätzliche Informationen, dass der Debugger einen Stack-Trace drucken verwendet. Der Wert von EXPR gibt an, wie viele Frames Anruf vor dem aktuellen zurück zu gehen.

#  0         1          2      3            4
  ($package, $filename, $line, $subroutine, $hasargs,
#  5          6          7            8       9         10
$wantarray, $evaltext, $is_require, $hints, $bitmask, $hinthash)
 = caller($i);

Sie auch die Devel :: Abdeckung Modul verwenden können:

  

Code-Coverage-Daten werden mit einer steckbaren runops Funktion gesammelt, das zählt, wie oft jeder op ausgeführt wird. Diese Daten werden dann zurück in der Realität mit dem B-Compiler-Module abgebildet. Es gibt auch eine Erklärung Profilierungseinrichtung, die ein besseres Backend muss wirklich nützlich sein.

Je mehr du uns erzählen, was Sie tun wollen, desto hilfreicher Sie unsere Antworten werden!

Andere Tipps

Wenn es Ihr Code ist, könnten Sie verwenden möchten:

Carp::cluck( "And here's the stack:" );

Siehe Carp::cluck . Es gibt eine Warnung mit einem Stack-Trace aus. Es funktioniert wie der „printf“ Stil der Debug-Ausgabe.

Mit dem T Befehl des Debuggers.

Beispiel:

$ perl -d -e'
sub foo {}
sub bar { foo; }
bar;
'

Loading DB routines from perl5db.pl version 1.32
Editor support available.

Enter h or `h h' for help, or `man perldebug' for more help.

main::(-e:4):   bar;
  DB<1> s
main::bar(-e:3):        sub bar { foo; }
  DB<1> s
main::foo(-e:2):        sub foo {}
  DB<1> T
. = main::foo() called from -e line 3
. = main::bar() called from -e line 4
  DB<1> s
Debugged program terminated.  Use q to quit or R to restart,
  use o inhibit_exit to avoid stopping after program termination,
  h q, h R or h o to get additional info.
  DB<1> q

Sie müssen nur selten direkt den Call-Stack in Perl verwalten. Wenn Sie tun, ist caller das Werkzeug, das Sie wollen. Es wird jedoch nur selten benötigt werden.

Häufiger Ich möchte einen Stack-Trace, um zu sehen, wenn ich Debuggen bin. Eine gute Nachricht, ist es einfach einen Stack-Trace zu erhalten, verwenden Sie einfach Carp 's confess und cluck Funktionen statt die und warn.

use strict;
use warnings;
use Carp;

bar(6.1);
bar(1);

sub foo {
    confess "Oh noes" unless @_ == 6;  # confess is fatal
}

sub bar {
    my $count = shift;
    cluck "bar is in trouble" unless int $count == $count;  # cluck is not fatal
    foo( ('a')x $count );
}

Diese bekommt man:

dao:~ toad$ perl test.pl
bar is in trouble at test.pl line 14
    main::bar(6.1) called at test.pl line 5
Oh noes at test.pl line 9
    main::foo('a') called at test.pl line 15
    main::bar(1) called at test.pl line 6
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top