Déboguer un script perl qui contient une instruction "exec"
3 réponses
Gingko
Bonjour,
Je ne suis aucunement familier avec le langage "perl", bien qu'habitué à
d'autres langages de programmation (C, C++, PHP, et quelques autres).
Je suis néanmoins amené à tenter de comprendre pourquoi un script "perl"
écrit par quelqu'un d'autre ne fonctionne pas correctement (en fait, il
s'agit d'un des scripts nommés "webalizer.pl" qui font partie du module
"webalizer" de l'interface d'administration "webmin").
Malgré ma faible connaissance de ce langage, j'ai quand même fini par
comprendre que je pouvais déboguer ce script en le lançant avec la commande
"perl -d", et ensuite exécuter les instructions en pas à pas et interroger
les variables.
Malheureusement le script se termine par un truc comme ça :
exec("$root/webalizer/webalizer.pl", @ARGV) || die "Failed to run
$root/webalizer/webalizer.pl : $!";
Ce qui, de toute évidence, exécute un autre script en lui passant un
paramètre, et après avoir préalablement initialisé une quantité de variables
d'environnement dont l'exécution de cet autre script dépend.
Le problème est que le débogueur, arrivé à cette instruction, exécute le
script imbriqué comme un tout, même si j'exécute une commande "s" (Single
step), et je ne trouve pas de moyen de faire en sorte de déboguer à
l'intérieur de ce second script, alors que de toute évidence, c'est là que
tout ce qui m'intéresse se passe.
Comment faire pour déboguer à l'intérieur d'une instruction "exec" en pas à
pas de la même manière que je le fais depuis le script appelant (sans
appeler ce second script depuis l'extérieur, puisque dans ce cas,
l'environnement préinitialisé n'existerait pas) ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Nicolas George
"Gingko" wrote in message <4bd609c8$0$12082$:
exec("$root/webalizer/webalizer.pl", @ARGV) || die "Failed to run $root/webalizer/webalizer.pl : $!";
Ce qui, de toute évidence, exécute un autre script
Non, ça exécute un autre fichier exécutable. Le fait que cet exécutable soit lui-même un script, dans le même langage qui plus est, est purement fortuit.
La solution : remplacer l'exécution directe par un appel au débugger.
"Gingko" wrote in message <4bd609c8$0$12082$426a74cc@news.free.fr>:
exec("$root/webalizer/webalizer.pl", @ARGV) || die "Failed to run
$root/webalizer/webalizer.pl : $!";
Ce qui, de toute évidence, exécute un autre script
Non, ça exécute un autre fichier exécutable. Le fait que cet exécutable soit
lui-même un script, dans le même langage qui plus est, est purement fortuit.
La solution : remplacer l'exécution directe par un appel au débugger.
exec("$root/webalizer/webalizer.pl", @ARGV) || die "Failed to run $root/webalizer/webalizer.pl : $!";
Ce qui, de toute évidence, exécute un autre script
Non, ça exécute un autre fichier exécutable. Le fait que cet exécutable soit lui-même un script, dans le même langage qui plus est, est purement fortuit.
La solution : remplacer l'exécution directe par un appel au débugger.
Gingko
"Nicolas George" <nicolas$ a écrit dans le message de news: 4bd60a9c$0$26553$
"Gingko" wrote in message <4bd609c8$0$12082$:
exec("$root/webalizer/webalizer.pl", @ARGV) || die "Failed to run $root/webalizer/webalizer.pl : $!";
Ce qui, de toute évidence, exécute un autre script
Non, ça exécute un autre fichier exécutable. Le fait que cet exécutable soit lui-même un script, dans le même langage qui plus est, est purement fortuit.
La solution : remplacer l'exécution directe par un appel au débugger.
Effectivement, je ne l'avais pas vu comme ça.
Remplacer l'exécution directe par un appel au debugger étant une complication (car juste écrire « exec("perl -d $root/webalizer/webalizer.pl", @ARGV) || die "Failed to run $root/webalizer/webalizer.pl : $!"; » ne marche pas, et je ne connais pas bien toutes les subtilités de l'instruction "exec" pour faire ça, je m'en suis tiré autrement :
J'ai remplacé la première ligne du script à déboguer ( #!/usr/bin/perl ) par celle-ci : #!/usr/bin/perl -d
Merci de votre réponse.
Gingko
"Nicolas George" <nicolas$george@salle-s.org> a écrit dans le message de
news: 4bd60a9c$0$26553$426a34cc@news.free.fr...
"Gingko" wrote in message <4bd609c8$0$12082$426a74cc@news.free.fr>:
exec("$root/webalizer/webalizer.pl", @ARGV) || die "Failed to run
$root/webalizer/webalizer.pl : $!";
Ce qui, de toute évidence, exécute un autre script
Non, ça exécute un autre fichier exécutable. Le fait que cet exécutable
soit
lui-même un script, dans le même langage qui plus est, est purement
fortuit.
La solution : remplacer l'exécution directe par un appel au débugger.
Effectivement, je ne l'avais pas vu comme ça.
Remplacer l'exécution directe par un appel au debugger étant une
complication (car juste écrire « exec("perl -d
$root/webalizer/webalizer.pl", @ARGV) || die "Failed to run
$root/webalizer/webalizer.pl : $!"; » ne marche pas, et je ne connais pas
bien toutes les subtilités de l'instruction "exec" pour faire ça, je m'en
suis tiré autrement :
J'ai remplacé la première ligne du script à déboguer ( #!/usr/bin/perl ) par
celle-ci : #!/usr/bin/perl -d
"Nicolas George" <nicolas$ a écrit dans le message de news: 4bd60a9c$0$26553$
"Gingko" wrote in message <4bd609c8$0$12082$:
exec("$root/webalizer/webalizer.pl", @ARGV) || die "Failed to run $root/webalizer/webalizer.pl : $!";
Ce qui, de toute évidence, exécute un autre script
Non, ça exécute un autre fichier exécutable. Le fait que cet exécutable soit lui-même un script, dans le même langage qui plus est, est purement fortuit.
La solution : remplacer l'exécution directe par un appel au débugger.
Effectivement, je ne l'avais pas vu comme ça.
Remplacer l'exécution directe par un appel au debugger étant une complication (car juste écrire « exec("perl -d $root/webalizer/webalizer.pl", @ARGV) || die "Failed to run $root/webalizer/webalizer.pl : $!"; » ne marche pas, et je ne connais pas bien toutes les subtilités de l'instruction "exec" pour faire ça, je m'en suis tiré autrement :
J'ai remplacé la première ligne du script à déboguer ( #!/usr/bin/perl ) par celle-ci : #!/usr/bin/perl -d
Merci de votre réponse.
Gingko
Stephane CHAZELAS
2010-04-27, 00:36(+02), Gingko: [...]
Remplacer l'exécution directe par un appel au debugger étant une complication (car juste écrire « exec("perl -d $root/webalizer/webalizer.pl", @ARGV) || die "Failed to run $root/webalizer/webalizer.pl : $!"; » ne marche pas, et je ne connais pas bien toutes les subtilités de l'instruction "exec" pour faire ça, je m'en suis tiré autrement :
Remplacer l'exécution directe par un appel au debugger étant une
complication (car juste écrire « exec("perl -d
$root/webalizer/webalizer.pl", @ARGV) || die "Failed to run
$root/webalizer/webalizer.pl : $!"; » ne marche pas, et je ne connais pas
bien toutes les subtilités de l'instruction "exec" pour faire ça, je m'en
suis tiré autrement :
Remplacer l'exécution directe par un appel au debugger étant une complication (car juste écrire « exec("perl -d $root/webalizer/webalizer.pl", @ARGV) || die "Failed to run $root/webalizer/webalizer.pl : $!"; » ne marche pas, et je ne connais pas bien toutes les subtilités de l'instruction "exec" pour faire ça, je m'en suis tiré autrement :