probleme de debugger
Le
espie
J'ai un bout de code qui recupere les exceptions a coup de
eval {.die };
if ($@) {
die # rethrow
}
probleme: comment debugguer tout ca ?
j'aimerais bien que perl -d me montre une stack trace a l'endroit du
premier die
eval {.die };
if ($@) {
die # rethrow
}
probleme: comment debugguer tout ca ?
j'aimerais bien que perl -d me montre une stack trace a l'endroit du
premier die

Poser une question


(Marc Espie) écrivait (wrote):
Il est encore possible d'utiliser $SIG{__DIE__} pour capter 'die'
(cf. perlvar) même si la documentation dit qu'un jour cette
possibilité n'existera plus dans les 'eval'.
Mais je ne comprends pas le besoin... Pourquoi ne pas instrumenter
l'appel à 'die' lui-même en lui passant une référence comme argument
(cf. perldoc -f die) ? Dans cette référence on peut stocker toute
l'information nécessaire...
--
Paul Gaborit - Perl en français -
En fait, j'ai ete un peu vite en description... ce qui m'interesse, c'est
un cas ou ce n'est pas moi qui suis a l'origine du die. En l'occurrence,
un $object->method avec $object qui vaut undef...
Et perl -d me donne un backtrace... du 2e die. Et j'aimerais non pas capter
die, mais pouvoir dire "si debugguer, alors tu me fais un backtrace dans
l'eval, PUIS tu recuperes l'exception, puis tu continues" et je ne vois
pas trop comment faire...
(Marc Espie) écrivait (wrote):
Sans l'avoir testé via le debugger (je ne l'utilise quasiment jamais),
je pense que le code suivant peut aider :
sub f {
die "erreur";
}
eval {
$SIG{__DIE__} = sub {
warn "die handler: @_n"; # !!!
};
f();
}
if ($@) {
warn "$@n";
}
Dans la subroutine anonyme attachée à __DIE__ on voit très bien toute
la pile d'appel dans le contexte du premier 'die' (en passant par
f()). Cette pile est certainement visible dans le debugger... mais
aussi via le module Carp si ne souhaite pas utiliser le debugger :
use Carp;
sub f {
die "erreur";
}
eval {
$SIG{__DIE__} = sub {
Carp::cluck "die handler: @n";
};
f();
};
if ($@) {
warn "$@n";
}
--
Paul Gaborit - Perl en français -
Heureux homme... moi je n'ai pas le choix, avec du gros, gros code en
production, quand d'aventure ca plantouille, je peux difficilement demander
mieux a mon bug-reporter que de me faire un perl -d....
Bon, j'essaierai sans doute ca ce week-end et je te tiens au courant...
(Marc Espie) écrivait (wrote):
C'est quoi un "bug-reporter" ? C'est un utilisateur à qui tu demandes
de t'envoyer une trace lors d'un plantage ?
Dans ce genre de situations, je préfère utiliser la technique que je
donnais pour dérouter les appels à "die" et enregistrer moi-même les
informations qui m'intéressent dans un fichier de log.
[...]
Tu m'en diras des nouvelles ! ;-)
--
Paul Gaborit - Perl en français -