Comment déboguer un service windows avec Delphi?
Est-il un moyen de déboguer complètement un service windows avec Delphi?
Vous devez vous connecter pour publier un commentaire.
Est-il un moyen de déboguer complètement un service windows avec Delphi?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser unitDebugService.pas de
Colin Wilson NT Faible Niveau Utilitaires(page est parti, disponible dans la wayback machine)puis dans la RMR:
De cette façon, vous pouvez exécuter à partir de l'intérieur de Delphes avec le débogage (en définissant le Débogueur du projet de Paramètres), utilisez l'EXE en tant que service, ou exécuter à partir de l'invite de commande avec la
-DEBUG
interrupteur, et .Il est en fait assez facile. Suffit d'utiliser la norme de DÉBOGAGE directive du compilateur pour démarrer le service, comme une application console au lieu de un service.
[..]
Utiliser Exécuter -> Attacher au processus. De cette façon, vous pouvez déboguer un service sans faire des modifications à son code. La seule partie délicate peut-être de débogage, le service de code de début, parce que la fixation peut exiger un certain temps, et le départ doit se produire dans les années 30 (bien que vous pouvez modifier Windows pour permettre à un plus de temps). Vous pouvez utiliser un delay (sommeil...) pour vous permettre de joindre dans le temps, ou si vous avez juste besoin de voir ce qui se passe, vous pouvez utiliser OutputDebugString() pour imprimer à la sortie de débogage (utiliser Delphi Affichage d'Événement pour le voir).
Attach to Process
fonctionne très bien. Lorsque le débogueur se connecte d'abord au service du processus, le CPU de la fenêtre n'apparaît pas, mais vous pouvez tout simplement le faire disparaître et appuyez sur F9 ou le bouton Exécuter de poursuivre l'exécution du service normalement, et puis vous pouvez déboguer son code en fonction des besoins comme tout autre projet.Oui, il y a:
Débogage de services: une façon simple
Ensuite, il ne devrait résoudre ce problème.
Fondamentalement, pour déboguer un Win2 service, il existe quelques façons:
Si vous pour une raison quelconque n'a qu'CPU affichage de votre service après le démarrage de débogage, ce qui signifie que Delphi débogueur ne peut pas trouver les informations de débogage pour votre service. C'est un autre problème et vous devriez la recherche de solution pour elle.
Généralement, ce que vous devez faire:
Oui, il est.
Dans votre dpr:
DebugService est une procédure qui crée un debug forme, un service de contrôle de fil et coups de pied tout en appelant les Formes.Application.Exécutez.
Vous pouvez comparer le service de contrôle de fil avec Windows " SCM (Service Control Manager), le débogage de forme avec une application qui parle à la SCM (tels que les services.msc) pour démarrer et arrêter les services. Le service doit aussi avoir son propre thread (thread de service) pour répondre à des codes de commande en provenance de la SCM ou par notre service de contrôle de fil et un ou beaucoup plus de threads séparés pour faire son travail réel. Vous voulez des threads séparés pour le travail réel (au lieu de codage dans les gestionnaires d'événements de votre TService descendant), de sorte que le thread dans lequel le TService dirige lui-même est toujours libre de répondre à des codes de contrôle de la SCM et vous pouvez toujours arrêter et démarrer le service, même quand par hasard/le thread de travail est gelé.
Cette approche permet de déboguer l'application de service de code en tant que bien, mais implique une grande quantité de code et de placer un couple de crochets dans les fonctions de l'api windows pour fonctionner correctement. Trop de choses à montrer ici, à court préavis. Peut-être que je vais l'écrire dans un article à jour.
Dans le temps de le dire, si vous ne voulez pas de code vous-même, vous avez deux options. Soit aller avec une bibliothèque comme SVCOM ou celle mentionnée par Mick qui faisons tout pour vous, ou en mode débogage by-passer le code de service, tous ensemble, et "tout simplement" démarrer le service "normale", les formulaires de demande. Vous aurez à démêler le réel de la fonctionnalité de votre service auprès de votre TService descendant du code/les gestionnaires d'événements, mais c'est quelque chose que je vous recommande tout de même, pour les raisons mentionnées ci-dessus.