Cela m'est arrivé à plus d'une occasion et a conduit à de nombreuses heures perdues à la chasse à un fantôme. Aussi typique, lorsque je débogage du code de synchronisation vraiment difficile, je commence à ajouter des tonnes d'appels de sortieDebugstring () afin que je puisse obtenir une bonne image de la séquence d'opérations connexes. Le problème est que l'IDE Delphi 6 semble être capable de ne gérer que cette situation aussi longtemps. Je vais utiliser un exemple concret que je viens d'éviter les généralités (autant que possible). P>
J'ai passé plusieurs jours à déboguer mon code de verrouillage de sémaphore interentrautrice avec mon code de calcul d'horodatage DirectShow, ce qui causait des problèmes profondément frustrants. Après avoir éliminé chaque bogue, je pouvais penser, j'ai toujours eu un problème avec Skype , que mon L'application envoie de l'audio à. p>
Après environ 10 secondes, le délai entre mon parler et entendre ma voix est sorti de Skype sur le deuxième PC que j'utilisais pour tester, l'extrémité de l'appel, a commencé à croître. À environ 20 à 30 secondes, le délai a commencé à croître de manière exponentielle et à ce point déclenché du code, j'ai des vérifications pour voir si une section critique était trop longue. P>
Heureusement, il n'était pas trop tard la nuit et que cela a déjà été à travers cela auparavant, j'ai décidé d'arrêter de tracer sans relâche et d'éteindre la majorité de la sortieDebuggstring (). Heureusement, j'avais la plupart d'entre eux enveloppés dans un compilateur conditionnel définir ainsi il était facile à faire. L'instant que j'ai fait cela, les problèmes sont partis et il s'est avéré que mon code fonctionnait bien. P>
Il semble donc que l'IDE Delphi 6 commence à être vraiment déroulant lorsque la quantité de trafic de sortie () est au-dessus de certains seuils. Peut-être que c'est juste la tâche d'ajouter des chaînes au volet de débogueur d'événement, qui détient tous les rapports de la sortie (). Je ne sais pas, mais j'ai vu des problèmes similaires dans mes applications lorsqu'un TMEMO ou un contrôle similaire commence à contenir trop de chaînes. P>
Qu'est-ce que ceux d'entre vous ont fait pour empêcher cela? Existe-t-il une façon de nettoyer le journal des événements via un appel de méthode ou au moins un moyen de limiter sa taille? De plus, quelles techniques utilisez-vous via des définies conditionnelles, des plug-ins ide ou autre, pour faire face à cette situation? P>
4 Réponses :
Je n'utilise presque jamais la sortieDebuggstring. J'ai du mal à analyser la sortie dans l'IDE et il faut des efforts supplémentaires pour conserver plusieurs séries de plusieurs pistes. P>
Je préfère vraiment une bonne combinaison de composants de journalisation (codesite, SmartInspect) et logez généralement à divers fichiers. Les fichiers standard par exemple sont "Général", "Débogage" (informations de débogage standard que je souhaite collecter à partir d'une installation cliente également), "Configuration", "Services", "Clients". Celles-ci sont toutes configurées pour "Overflow" à un ensemble de fichiers numérotés, ce qui vous permet de conserver les journaux de plusieurs exécutions en permettant simplement à des fichiers plus numériques. La comparaison des informations de journal de différentes pistes devient beaucoup plus facile de cette façon. P>
Dans la situation que vous décrivez, j'ajouterais des déclarations de débogage qui se connectent à un fichier journal séparé. Par exemple, "trace". Le code pour rendre "Trace" disponible est entre définir des définitions conditionnelles. Cela fait de le transformer sur assez simple. P>
Pour éviter de partir dans ces relevés de débogage supplémentaires, j'ai tendance à apporter les modifications à allumer le journal "Trace" sans le vérifier à partir du contrôle de la source. De cette façon, le compilateur du serveur de construction jettera des erreurs "identifiant non définies" sur des déclarations non involontaentalement laissées dans. Si je veux conserver ces déclarations supplémentaires, je les modifiais pour accéder au journal "Débogage" ou les mettre entre Définition conditionnelle. P>
Merci pour les conseils sur les composants de la journalisation. Je vais regarder ceux-ci. Cependant, je trouve que pour certains cas de débogage critiques en temps réel à grande vitesse, la rédaction d'un fichier journal perturbe trop le calendrier ou même le rend impossible. Mais en dehors de cette étroite tranche d'utilisation des cas, ils aident certainement beaucoup.
@ROBERTOSCHLER: Je n'ai fait aucun travail en temps réel, mais dans le logiciel de serveur fortement performant multi-threadé (à mon employeur), nous pouvons généralement nous en tirer un peu de journalisation avant que les horaires ne changent suffisamment pour le comportement de changer et de faire disparaître le bogue. Bien sûr, vous souhaitez conserver vos messages de journalisation courts et éviter la concaténation de la chaîne (format d'utilisation), la réaffectation de la mémoire, les appels de fonction ou les getteurs de propriété pour la journalisation autant que possible.
La première chose que je ferais est de faire certain que le problème est ce que vous pensez que c'est. Cela fait longtemps que je n'ai utilisé que Delphi, je ne suis donc pas sûr des limitations de l'IDE, mais je suis un peu sceptique que le journal des événements commencera enlèvement de manière exponentielle au fil du temps avec le même nombre de cordes de débogage étant écrit dans une période de 20-30 secondes. Il semble plus probable que le nombre de chaînes de débogage écrits augmente avec le temps pour une raison quelconque, ce qui pourrait indiquer un bogue dans votre flux de contrôle d'application qui n'est tout simplement pas aussi évident avec la journalisation désactivée. P>
Assurez-vous que j'essaierais d'écrire une application simple qui s'exécute simplement dans une boucle écrit des chaînes de débogage en morceaux de 100 environ environ, et commencez à enregistrer le temps nécessaire pour chaque morceau et voyez si le temps commence à augmenter comme significativement sur une période de 20 à 30 secondes. P>
Si vous vérifiez que c'est le problème - ou même si ce n'est pas - alors je recommanderais d'utiliser un type de bibliothèque de journalisation. La sortieDebugstring perd vraiment son efficacité lorsque vous l'utilisez pour des décharges de bûches massives comme ça. Même si vous trouvez un moyen de réinitialiser ou de limiter la fenêtre de sortie, vous perdrez toutes les données de journalisation. P>
Merci. Voir mon commentaire à Marjan ci-dessous en ce qui concerne la journalisation.
Une bonne bibliothèque de journalisation vous permettra de configurer la mise en mémoire tampon afin que vous n'ayez pas frappé avec une écriture de fichier pour chaque entrée de journal. Il ne serait donc plus perturbateur que la sortieDebuggstring. Beaucoup d'entre eux peuvent également utiliser des processus externes pour gérer les entrées du journal et transmettre les entrées de journal via une mémoire partagée, ce qui est essentiellement la même chose de sortie debuggstring.
Un problème similaire m'est arrivé auparavant avec Delphi 2007. Désactiver la visualisation des événements dans l'IDE et utilisez plutôt DEBUGVIEW de sysinternals . p>
J'ai débogview mais je ne savais pas que vous pourriez désactiver la visualisation des événements. Je verrai si Delphi6 a cette option, merci.
... On m'a dit que la raison de la lenteur est due à un stringgrid étant utilisé pour le journal des événements (c'est maintenant un virtualstringtree). ici est une cache du fil de mon problème spécifique, qui était sur l'EMB .. Forums à cette époque.
Pack IDE Fix a un Optimisation pour améliorer les performances de la sortieDebugstring p>
La vue du journal de débogage de l'IDE a également une optimisation. Le débogueur maintenant met à jour la vue de journal uniquement lorsque l'IDE est inactif. Cela permet à l'IDE de rester sensible lorsque des centaines de messages de sortie de la sortie ou d'autre Les messages de débogage sont écrits dans la vue du journal de débogage. P> blockQuote>
Notez que cela ne fonctionne que sur Delphi 2007 et plus. P>
Voyez ici pour trouver quelle bibliothèque-bibliothèque-est-meilleure .
@Lurd. Merci! Nice post rond-point sur les outils de journalisation.