Come posso ottenere tracce di stack in Perl?Ottenere tracce di stack in Perl?
risposta
Ci sono molti utili, cor e e strumenti basati su CPAN per generare una traccia di stack (come illustrano altre risposte). Tuttavia, se vuoi eseguire il rollover, controlla il built-in caller
. Puoi usarlo per scendere in cima allo stack e vedere esattamente cosa sta succedendo.
Carp::confess
(da use Carp;
) fornisce una traccia stack completa come parte dell'errore. Se ti serve solo come parte di qualcosa che non funziona, lo confess
è tutto ciò di cui hai veramente bisogno.
Per commenti, ecco l'uscita di vari Carp
funzioni:
use strict;
use warnings;
use Carp qw/longmess cluck confess/;
sub foo {
&bar;
}
sub bar {
&baz;
}
sub baz {
shift->();
}
my %tests = (
'longmess' => sub { print longmess 'longmess' },
'cluck' => sub { cluck 'using cluck' },
'confess' => sub { confess 'using confess' },
);
while (my ($name, $sub) = each %tests) {
print "$name - before eval:\n";
eval {
foo($sub);
};
print "$name - before if:\n";
if ([email protected]) {
print "caught: [email protected]";
}
print "$name - done\n\n";
}
esecuzione di questo script, si ottiene:
longmess - before eval: longmess at - line 14 main::baz called at - line 10 main::bar called at - line 6 main::foo('CODE(0x183a4d0)') called at - line 26 eval {...} called at - line 25 longmess - before if: longmess - done confess - before eval: confess - before if: caught: using confess at - line 20 main::__ANON__() called at - line 14 main::baz called at - line 10 main::bar called at - line 6 main::foo('CODE(0x183a3e0)') called at - line 26 eval {...} called at - line 25 confess - done cluck - before eval: using cluck at - line 19 main::__ANON__() called at - line 14 main::baz called at - line 10 main::bar called at - line 6 main::foo('CODE(0x183a434)') called at - line 26 eval {...} called at - line 25 cluck - before if: cluck - done
esecuzione di questo script ma reindirizzamento STDOUT (mostrando quindi ciò che viene stampato su STDERR) , ottieni:
using cluck at - line 19 main::__ANON__() called at - line 14 main::baz called at - line 10 main::bar called at - line 6 main::foo('CODE(0x183a434)') called at - line 26 eval {...} called at - line 25
Che invia lo stack trace e l'errore a STDERR; se hai bisogno di catturarlo, usa direttamente il sottostante Carp :: longmess(). E Carp :: cluck è come confessare ma muore in seguito. – ysth
Penso che sia indietro - "cluck" è un warn con una traccia stack e "confess" è un dado. – mob
err, sì, che era indietro – ysth
Per esigenze di debug, mi piace Carp::Always.
perl -MCarp::Always my_script.pl
Mi sembra di aver bisogno di fare -MCarp = verbose – brianegge
Modo semplice con caller
. Questo codice non utilizza alcun modulo aggiuntivo. Basta includerlo dove necessario.
my $i = 1;
print "Stack Trace:\n";
while ((my @call_details = (caller($i++)))){
print $call_details[1].":".$call_details[2]." in function ".$call_details[3]."\n";
}
- 1. Come accedere tracce dello stack in node.js
- 2. In attesa di .NET 4.0: tracce di stack significative
- 3. Pulisci tracce di stack in Groovy utilizzando Eclipse?
- 4. Evidenziazione delle tracce dello stack python
- 5. Python: eliminazione delle tracce di stack nel codice della libreria?
- 6. Test di unità con tracce di stack completo
- 7. Aggiungi informazioni specificate dall'utente alle tracce di stack java
- 8. Django: come ottenere tracce di stack per gli avvisi di runtime
- 9. GWT: invia errori lato client/tracce di stack al server?
- 10. Posso ottenere le tracce dello stack di tutti i thread nella mia app C#?
- 11. Rails/Ruby: un modo per abbreviare le tracce dello stack?
- 12. Come posso ottenere un elenco di stack di chiamate in Perl?
- 13. Come posso ottenere i registri degli arresti anomali e le tracce di stack dalle app WinRT scritte in C#?
- 14. Pulitore, tracce dello stack più buone in GDB per template C++ (principalmente boost) - codice pesante
- 15. La registrazione e le tracce di stack anomali non vengono visualizzati in Android Studio
- 16. In che modo l'utilità perf di linux capisce le tracce dello stack? utility perf
- 17. Come posso ottenere una traceback in Perl?
- 18. API SoundCloud che restituisce 0 tracce nonostante l'utente abbia tracce
- 19. Strumento per estrarre tracce di stack java dai file di registro
- 20. Come posso evitare che emacs cancelli le tracce dello stack in modalità batch?
- 21. Come posso dire al compilatore di ignorare un metodo nelle tracce dello stack?
- 22. Le tracce di stack vengono generate quando viene generata un'eccezione Java?
- 23. tracce mix/unione 3GP/AMR
- 24. Come posso ottenere le dichiarazioni di stampa T-SQL in tracce di SQL Server Profiler?
- 25. La finestra Eclipse Logcat taglia le tracce dello stack delle eccezioni
- 26. Le tracce dello stack sono meno navigabili quando si utilizzano i riferimenti al metodo vs lambdas?
- 27. come ottenere i valori POST in perl
- 28. Registro tracce orribili Karma JSPM
- 29. Come posso ottenere una traccia di stack JavaScript in Firefox?
- 30. Come ottenere una traccia di stack in .NET nell'esecuzione normale?
Uh, o usare 'Devel :: StackTrace'. – jrockway
Questa è una multa, altra opzione. Ma richiede un modulo esterno, che può o non può trovare attraente. Perché non pubblicarlo semplicemente come risposta, invece di fare downvoting? –