Déboguer un script perl qui contient une instruction "exec"

Le
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) ?

Merci d'avance pour toute réponse.

Gingko
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Nicolas George
Le #21636061
"Gingko" wrote in message
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
Le #21636371
"Nicolas George" news: 4bd60a9c$0$26553$
"Gingko" wrote in message
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
Le #21637431
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 :


[...]

exec("perl", "-d", "$root/webalizer/webalizer.pl", @ARGV)

or maybe

do "$root/webalizer/webalizer.pl"; exit;

--
Stéphane
Publicité
Poster une réponse
Anonyme