2010-11-23 53 views
5

J'ai un appel "Rogue" OutputDebugString dans mon application qui imprime "T", mais je ne peux pas le localiser.Débogage des appels OutputDebugString dans Delphi

Est-il possible de définir un point d'arrêt sur OutputDebugString -function et de voir d'où il est appelé?

J'utilise Delphi 2009.

Répondre

13

Combien d'appels à OutputDebugString sont là dans votre projet? Vous pouvez utiliser la boîte de dialogue "Rechercher dans les fichiers" pour tous les trouver, et s'ils ne sont pas trop nombreux, il ne devrait pas y avoir de problème.

Sinon, vous pouvez - bien sûr - utiliser une recherche et remplacer et remplacer tous OutputDebugString( par raise Exception.Create(.

fonction Vous

procedure OutputDebugString(const Str: string); 
begin 
    raise Exception.Create(Str); 
end; 

pourrait également écrire dans une unité utilisée par toutes les autres unités dans le projet. Si seulement cette nouvelle unité est déclarée après Windows.pas dans la liste uses, cette nouvelle fonction sera utilisée à la place de celle de Windows.pas.

Mise à jour

Oui, vous pouvez placer des points d'arrêt à l'intérieur Windows.pas. Tout d'abord, dans votre projet, allez dans Options du projet, et sous Débogage, sélectionnez "Utiliser les DCU de débogage". Ensuite, vous pouvez aller à Windows.pas et placer un point d'arrêt à la ligne 30769:

procedure OutputDebugString; external kernel32 name 'OutputDebugStringW'; 
+1

Trop de propagation à travers le projet et les composants .. Je ne suis même pas sûr si le message provient de code propre ou tiers. – Harriv

+0

Oui, le débogage DCU le fait. Maintenant, j'ai juste besoin de comprendre comment régler la condition .. – Harriv

+2

si ce n'est pas votre code, mais une unité que vous utilisez (indirectement) l'appel pourrait également aller à OutputDebugStringA. – Remko

7
  • Exécutez votre application.
  • Mettez-le en pause.
  • Fenêtre Ouvrir/Déboguer/Modules fenêtre.
  • Recherchez kernel32.dll. Double-cliquez dessus.
  • Recherchez OutputDebugStringA. Double cliquez dessus.
  • La fenêtre CPU s'ouvre. Définir un point d'arrêt à très première ligne.
  • Recherchez OutputDebugStringW. Double cliquez dessus.
  • La fenêtre CPU s'ouvre. Définir un point d'arrêt à très première ligne.

Terminé.

Maintenant, tout appel à OutputDebugString à partir de votre application se casse au point d'arrêt. Vous pouvez également activer la journalisation des propriétés de point d'arrêt pour consigner la pile d'appels.