Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

3 réponses
Avatar
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

3 réponses

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


[...]

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

or maybe

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

--
Stéphane