VIII. Déchargement et débogage des ISAPI▲
Un des grands problèmes du débogage des ISAPI est dû au fait que la DLL, une fois chargée, reste en mémoire.
Si vous voulez recompiler un projet, il vous faudra tout d'abord décharger cette DLL. Il existe plusieurs solutions pour faire face à ce problème.
- Développer un CGI plutôt qu'un ISAPI (qui ne sera donc pas en cache à chaque appel), puis le transformer en ISAPI lors du stade final.
- Sous NT ou W2K, dans le IIS Manager, vous allez sur le répertoire racine « mon site Web », bouton droit de la souris, propriétés et sous paramètres d'application, vous cliquez sous « configuration » et désactivez le Checkbox « mettre en cache les applications ISAPI ». Ne pas oublier de recocher cette case lors de la mise en production.
- Utiliser un outil externe. Il en existe plusieurs, le plus utilisé étant un shareware, omnihttpd : http://www.omnicron.ab.ca/httpd/. L'ennui que j'ai constaté : il ne fonctionne pas avec des frames. Ou alors le débogueur Intrabob de Bob Swart (alias DrBob) : http://www.drbob42.com/tools/index.htm. Ou encore : http://dataweb.de/isapie.htm. Un autre que j'utilise, mais il est payant, Falcon : http://www.blueface.com/.
- Ce qui suit :
Décharger une DLL sous Win98
Procédure
- Faire un raccourci vers PWS (c:\windows\system\inetsrv\pws.exe).
- Bouton droit de la souris sur le nouveau raccourci et changer la cible qui devient : « c:\windows\system\inetsrv\pws.exe /stop ». Ceci permettra de décharger la DLL. Mais pour la déboguer (et c'est bien plus pratique) :
- Dans « projet », aller sous run/parameters (j'ai d5 c/s en anglais) et dans application hôte et mettre « c:\windows\system\inetsrv\inetinfo.exe ».
- Sous paramètres, mettre « -e w3svc ».
- Dans le projet, aller sous « /projet/options/répertoires », et dans output directory mettre « c:\inetpub\scripts » (ou le répertoire de script ayant les droits d'exécution) (enfin, ça, c'est sous NT).
- À partir de là, il y a possibilité de déboguer la DLL mais il ne faut pas que PWS soit lancé. On peut l'arrêter par l'icône du system tray (bouton droit puis Stop service). Là, l'icône doit avoir un X rouge. Pour décharger complètement le PWS, il faut cliquer sur le raccourci créé plus haut.
Décharger une DLL sous Win2000
La méthode que j'utilise est de passer par un paramètre d'application de IIS5. Pour y arriver, il faut déclarer la DLL dans un processus mémoire séparé. Pour ce faire, sous l'administrateur IIS5, sélectionner le répertoire contenant la DLL (en général scripts) :
puis bouton droit de la souris et propriétés. Une fenêtre s'ouvre et sous paramètres d'application, il faut mettre pour nom de l'application, le nom de votre DLL. La protection d'application doit être réglée sur Élevée (Isolé) ou moyenne. De cette façon, si votre DLL « plante », elle ne plantera pas le serveur Web.
À partir de là, il vous suffit de stopper le serveur Web dans l'administrateur IIS et de le relancer. Votre DLL sera déchargée.
Ou alors :
La prochaine fois que vous appellerez votre DLL, vous ouvrirez à nouveau cette fenêtre et le bouton « Décharger » ne sera plus grisé. Il suffira de le cliquer pour pouvoir à nouveau compiler votre DLL.
Sur mon site vous pourrez trouver un petit exe avec sources qui vous permettra de décharger le répertoire automatiquement.
Décharger une DLL sous NT 4
La même procédure que ci-dessus peut être utilisée pour NT4. Cependant, il m'est arrivé fréquemment qu'en cliquant sur le bouton « décharger », le serveur Web plante lamentablement, tout simplement. Le pourquoi du comment dans l'article de Stéphane ci-dessous. Sous Win2000, ce procédé est nettement plus efficace, mais vous ne pourrez par contre plus déboguer vos DLL tant que ce paramètre existera.
Débogage de DLL ISAPI
Pour le débogage lui-même, voici une traduction, avec sa permission, de la page de l'excellent Stéphane Grobéty :o)
Débogage sous W2K et IIS5
- Lancer le manager IIS WWW ;
- Ouvrir Internet Services Manager et lancez votre site Web ;
- Ouvrir l'onglet des propriétés de votre répertoire /scripts (ou celui où vous placez vos DLL) ;
- Choisir protection d'application « basse » ;
- Cliquez sur le bouton de configuration et choisissez l'onglet débogage de l'application ;
- Activez les deux boutons indicateurs de débogage ;
- Fermez le manager de services Internet et arrêtez le service IIS WWW (n'arrêtez pas votre site web avant d'arrêter IIS)) ;
- Mettez sous Run¦Paramètres : application hôte : C:\WINNT\system32\inetsrv\inetinfo.exe. Sous paramètres : -e w3svc ;
- C'est tout !
Une autre méthode de débogage sous W2K avec le service des composants (COM+)
Une méthode apparemment complexe, mais une fois réglée, ça fonctionne pile-poil. Par contre, ne pas oublier de tout remettre en état après la séance de débogage si vous travaillez directement sur le site de production.
Étape 1
Comme dans NT4, la première étape consiste à créer un répertoire virtuel (celui où vous placerez votre DLL, en général /Scripts) sur votre site sous IIS. S'il n'existe pas : clic droit sur la ligne de votre site Web--> Nouveau --> répertoire virtuel. Dans les propriétés de ce répertoire virtuel, le Nom de l'application devrait être à la base le nom du répertoire virtuel (en principe Scripts).
Sous Exécuter les autorisations, il faut mettre « Scripts et exécutables ». Enfin, sous Protection d'application, pour le débogage et non en production, il faut mettre Élevée (Isolé).
Rem. : en fait, ce réglage sur « Isolé » lancera pour chaque DLL une nouvelle instance de Dllhost.exe, qui, comme son nom l'indique, prend en charge votre ISAPI (sous protection moyenne, toutes vos DLL seront placées dans une seule instance de Dllhost.exe). Si votre Dllhost.exe gonfle, ceci est dû au fait que le réglage d'AspTrackTrheadingModel dans la métabase d'IIS5 n'est pas bon. Il faut que cette valeur soit à 1 et non pas à 0 comme elle est initialisée lors d'un « fresh install » de w2k. Changez ces valeurs grâce à metaedit.exe que vous trouvez sous : http://support.microsoft.com/support/kb/articles/Q232/0/68.ASP?LN=EN-US&SD=gn&FR=0.
Votre DLL doit être placée dans ce répertoire. Si le bouton Décharger est activé, cliquez-le pour décharger votre DLL.
Étape 2
Dans le service des composants --> (Démarrer - Programmes - Outils d'administration - Service des composants - Ordinateurs - Poste de travail - Applications COM+) vous devriez maintenant voir votre répertoire virtuel. Rem. Il apparaîtra uniquement si votre protection d'application est réglée sur « Élevée » (p.ex. IIS-{Monsiteweb//Root/scripts})
Clic droit et sélectionnez les Propriétés.
Sous Identité, sélectionnez « Utilisateur interactif ».
Sous Avancé, débogage, activez « Ouvrir dans le débogueur ».
Ceci vous affichera la ligne de commande de l'appel du débogueur.
De cette ligne, copiez la partie ID du processus (partie depuis. /ProcessId:{no ID du processus COM})
Étape 3
Dans D5, sous projets - paramètres mettez c:\winnt\system32\dllhost.exe comme application hôte et sous paramètres, l'ID du processus que vous avez copié : il doit commencer par /Processid:{ et finir avec }).
Étape 4
Avant de lancer le projet, il faut être sûr qu'aucune instance de la DLL ne tourne et qu'elle soit bien déchargée. Si ce n'est pas le cas :
- retournez dans le service des composants, clic droit sur le répertoire virtuel et sélectionnez « arrêter » ;
- retour dans le gestionnaire IIS et cliquez sur le bouton « décharger » dont nous avons parlé avant.
D'autre part, il ne faut pas oublier, dans Delphi, de mettre sous Projets / Options / Répertoire, le chemin complet de votre répertoire virtuel (en général, c:\inetpub\scripts). De cette façon, votre DLL se placera directement dans le bon répertoire.
Lancez la DLL (ctrl-F9). Lancez votre browser avec l'adresse de votre ISAPI (http://localhost/scripts/myisapi.dll).
À cette étape, si vous avez placé vos points d'arrêt, vous devriez voir Delphi se mettre en premier plan avec l'EDI stoppé à vos points d'arrêt.
Quand vous avez terminé votre séance de débogage, utilisez la commande « arrêter » du service des composants. Cela déchargera votre DLL. Vous pourrez alors recommencer, etc.
Étape 5
Une fois votre séance de débogage terminée, remettez sous Identié dans le service des composants l'utilisateur IWAM_…
Si vous avez des problèmes pour obtenir l'utilisateur Web par défaut, faites comme suit :
- retournez dans IIS, et sous les propriétés de votre répertoire virtuel, remettez la protection d'application à « basse » ;
- contrôlez que votre DLL est déchargée. Après avoir effectué cela, remettez ce paramètre à Haute et confirmez. Dans le service des composants, faites un Actualiser de Applications COM+ et vous devriez retrouver l'utilisateur par défaut.
Vous pouvez alors changer à nouveau la protection de l'application sous « moyenne » ou « basse ». En actualisant Application COM+ sous le service des composants, le IIS-{Monsiteweb//Root/scripts}) devrait disparaître.