GNT sans publicité, site mobile, fonctionnalitées exclusives...

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
Lire les 8 réponses

Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Paul Gaborit
Le #20434251
À (at) Tue, 27 Oct 2009 12:01:49 +0000 (UTC),
(Marc Espie) écrivait (wrote):
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...



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 -
espie
Le #20436401
In article Paul Gaborit

À (at) Tue, 27 Oct 2009 12:01:49 +0000 (UTC),
(Marc Espie) écrivait (wrote):
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...



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...



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...
Paul Gaborit
Le #20437991
À (at) Tue, 27 Oct 2009 18:36:21 +0000 (UTC),
(Marc Espie) écrivait (wrote):
In article Paul Gaborit

À (at) Tue, 27 Oct 2009 12:01:49 +0000 (UTC),
(Marc Espie) écrivait (wrote):
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...



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...



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...



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 -
espie
Le #20438731
In article Paul Gaborit
Sans l'avoir testé via le debugger (je ne l'utilise quasiment jamais),
je pense que le code suivant peut aider :


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....

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";
}


Bon, j'essaierai sans doute ca ce week-end et je te tiens au courant...
Paul Gaborit
Le #20438721
À (at) Wed, 28 Oct 2009 07:46:08 +0000 (UTC),
(Marc Espie) écrivait (wrote):

In article Paul Gaborit
Sans l'avoir testé via le debugger (je ne l'utilise quasiment
jamais), je pense que le code suivant peut aider :



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....



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.

[...]
Bon, j'essaierai sans doute ca ce week-end et je te tiens au
courant...



Tu m'en diras des nouvelles ! ;-)

--
Paul Gaborit - Perl en français -
Publicité
Suivre les réponses
Poster une réponse
Anonyme