¿Cómo obtengo rastros de pila en Perl?Obteniendo rastros de pila en Perl?
Respuesta
Hay muchos útiles, cor e y herramientas basadas en CPAN para generar un seguimiento de pila (como lo ilustran otras respuestas). Sin embargo, si desea imprimir el suyo, consulte el caller
incorporado. Puede usar esto para bajar la pila y ver exactamente qué está sucediendo.
Carp::confess
(de use Carp;
) le dará un seguimiento completo de la pila como parte del error. Si solo lo necesita como parte de algo que falla, confess
es todo lo que realmente necesita.
por los comentarios, aquí está la salida de varios Carp
funciones:
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";
}
ejecutar este script, se obtiene:
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
La ejecución de este guión, pero redirigiendo la salida estándar (mostrando así lo que se imprime en stderr) , obtienes:
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
Eso envía la traza de la pila y el error a STDERR; si necesita capturarlo, use directamente el Carp :: longmess subyacente(). Y Carp :: cluck es como confesar pero muere después. – ysth
Creo que está al revés: 'cluck' es una advertencia con un seguimiento de pila y' confess' es un dado. – mob
err, sí, eso estaba al revés – ysth
Para las necesidades de depuración, me gusta Carp::Always.
perl -MCarp::Always my_script.pl
Parece que necesito hacer -MCarp = verbose – brianegge
Manera fácil usando caller
. Este código no usa ningún módulo adicional. Solo inclúyelo donde sea necesario.
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. Obteniendo rastros de pila en sistemas Unix, automáticamente
- 2. Rastros de pila MonoTouch no detallados
- 3. Pruebas unitarias con rastros de pila completos
- 4. Limpiar rastros de pila en Groovy usando Eclipse?
- 5. Rails/Ruby: ¿Alguna manera de acortar los rastros de pila?
- 6. GWT: ¿envía errores de cliente/rastros de pila al servidor?
- 7. ¿Cómo extraer los rastros de pila de minivolcados?
- 8. ¿Alguna razón para no registrar siempre los rastros de pila?
- 9. Deshabilitar rastros de la pila HTML por Xdebug
- 10. Python: eliminando los rastros de pila en el código de la biblioteca?
- 11. ¿Puedo obtener los rastros de la pila de todos los hilos en mi aplicación C#?
- 12. ¿Cómo puedo decirle al compilador que ignore un método en los rastros de pila?
- 13. ¿Cómo puedo evitar que emacs corte los rastros de pila en el modo por lotes?
- 14. ¿Cómo oculto los rastros de pila en el navegador (usando Jetty)?
- 15. Herramienta para extraer rastros de la pila Java de los archivos de registro
- 16. Limpiando el ruido de los rastros de la pila de Java
- 17. Django: cómo obtener rastros de pila para advertencias de tiempo de ejecución
- 18. madExcept, obteniendo la parte superior de la pila actual
- 19. Rastros de pila más limpios y bonitos en GDB para plantilla C++ (en su mayoría impulso) -código pesado
- 20. Obtención de seguimiento de pila de Perl Error "Memoria insuficiente"
- 21. ¿Cómo puedo obtener rastros de pila completos para minivolcados de modo mixto cuando están involucradas imágenes nativas (WPF)?
- 22. Rastreo de pila nativa en ICS?
- 23. ¿Cómo puedo reemplazar todos los 'dados' con 'confesar' en una aplicación Perl?
- 24. Creación de objetos en la pila/pila?
- 25. Obteniendo variables locales desde un marco de pila en la JVM
- 26. Obteniendo el seguimiento de pila para un error al ejecutar código desde la consola en Chrome
- 27. Obteniendo PEAR para trabajar en XAMPP (pila Apache/MySQL en Windows)
- 28. Nivel de pila demasiado profundo en Ruby
- 29. Obteniendo el número de línea jsp real de un número de línea de rastreo de pila?
- 30. JQuery UI elemento arrastrable deja rastros raros en Chrome
Uh, o usa 'Devel :: StackTrace'. – jrockway
Esa es una buena opción, otra. Pero requiere un módulo externo, que puede ser atractivo o no. ¿Por qué no simplemente publicar eso como una respuesta, en lugar de bajar el voto? –