Tengo algo de código Perl que funciona muy bien fuera del depurador:¿Por qué este bloque Perl BEGIN actúa de forma diferente en el depurador?
% perl somefile.pl
pero cuando lo ejecuto en el interior del depurador:
% perl -d somefile.pl
se comporta de manera diferente.
Los archivos en cuestión (hay varios) son parte del conjunto de pruebas para un gran módulo Perl (~ 20K líneas de código). Las pruebas realizan una gran cantidad de trabajo de configuración en tiempo de compilación y usan bloques BEGIN. Aquí hay un código mínimos para la reproducción:
BEGIN
{
package MyEx;
sub new { bless {}, shift }
package main;
eval { die MyEx->new };
if([email protected])
{
die "Really die" unless([email protected]>isa('MyEx'));
}
}
print "OK\n";
Si pones eso en somefile.pl
y ejecutarlo, se imprime "OK" como se esperaba. Si lo ejecuta en el depurador con perl -d somefile.pl
, se muere con este error:
Can't call method "isa" without a package or object reference ...
El resultado es que [email protected]
no es un objeto cuando el código se ejecuta en el depurador. En cambio, es un escalar no bendito que contiene esta cadena:
" at somefile.pl line 9
eval {...} called at somefile.pl line 9
main::BEGIN() called at somefile.pl line 16
eval {...} called at somefile.pl line 16
"
(nuevas líneas internas y espacios preservados Ese es el texto literal, incluso los "..." s.).
necesito código como este para funcionar en el depurador Usar el depurador en el banco de pruebas es una parte importante de mi flujo de trabajo. El módulo usa objetos de excepción y hace muchas cosas en el tiempo de compilación y espera que un objeto sea lanzado al ser capturado.
Mi pregunta (finalmente) es esta: ¿Cómo puedo hacer que esto funcione? ¿Hay alguna solución? ¿Es esto un error en el módulo de depuración de Perl? ¿Cuál es la mejor manera de resolver esto? (Sé que son varias preguntas, pero todas están relacionadas).
Estoy usando Perl 5.10.0 en Mac OS X 10.5.5.
Lo dieLevel sugerido por Adam Bellaire parecía prometedor, y de hecho algo (no se puede averiguar qué) está fijando a 1 para mí. Pero lo configuré en 0 usando un archivo ~/.perldb
y el problema persiste. De hecho, me puse los tres de los ajustes relacionados a 0. Mi ~/.perldb
archivo:
parse_options('dieLevel=0 warnLevel=0 signalLevel=0');
me confirmaron que los ajustes son, en efecto, mediante la ejecución del comando o
en el depurador. Los veo todos configurados en 0 cuando ejecuto perl -de 0
y también cuando ejecuto el archivo somefile.pl
real.
Gracias, brian. Usé perlbug
para presentar un error (RT 60890) y comencé a rociar local $SIG{'__DIE__'}
en todos los lugares apropiados de mi código. (Me di cuenta en el fallo que perldoc perldebug
todavía parece dar a entender que el valor por defecto es 0. dieLevel
)
Eres un hombre más valiente que yo, Brian. Cada vez que pienso en hurgar en perl5db, llego a los comentarios sobre lo enredado que es perder mi motivación. –