Question

Donc je voudrais mettre un point d'arrêt dans une API spécifique ou de messages de Windows.Je ne trouve pas de moyen facile de le faire sans avoir à écrire de code Delphi version.Est-il un moyen de le faire que de semblables que je peux mettre un point d'arrêt dans l'accès à la mémoire?

Était-ce utile?

La solution

Pour arrêter à tout appel à une fonction de l'API, vous la trouverez dans la implementation la section de De Windows.pas (ou partout où la fonction d'intérêts est déclaré) et de définir un point d'arrêt.Qui prend soin de fonctions que vous utilisez avec les temps de charge dynamique de la liaison.Pour le temps d'exécution de la liaison dynamique (LoadLibrary et GetProcAddress), vous aurez besoin d'une technique différente.La variable qui est le résultat de GetProcAddress va contenir l'adresse que vous souhaitez à briser, mais je ne sais pas en main la façon de définir un point d'arrêt à cette adresse.

De s'arrêter sur une Fenêtre de message est un peu plus compliquée car les messages peuvent être récupérées dans de nombreux endroits.Vous devrez utiliser les points d'arrêt conditionnels à la place.

Pour attraper la plupart des messages postés, vous pouvez mettre un point d'arrêt dans TApplication.HandleMessage sur la première ligne après l'appel à PeekMessage.Définir la condition d'être Msg.Message = x. HandleMessage prend soin de messages posté sur le thread principal message de la file d'attente pour les principaux Application.Run boucle de message ainsi que la VCL modal de la boucle de message.D'autres boîtes de dialogue modales (comme Windows.MessageBox) de ne pas l'utiliser, bien que.

L'observation envoyé messages est plus difficile car le système d'exploitation envoie à leur cible procédures de fenêtre directement.Vous devez définir un point d'arrêt dans la procédure de fenêtre de chaque classe de la fenêtre qui vous intéresse.Vous pourriez obtenir de plus VCL les classes de fenêtre en mettant votre point d'arrêt conditionnel dans Classes.StdWndProc.

Gardez à l'esprit que les points d'arrêt conditionnels peuvent être très lent.Ils travaillent par le débogueur de mettre un inconditionnel point d'arrêt là, et lorsque le système d'exploitation déclenche, le débogueur qui prend le dessus, vérifie la condition, puis reprend l'exécution si la condition d'échec.Cela peut entraîner beaucoup de frais généraux, de la commutation entre le débogueur et votre demande;programmes d' beaucoup de messages, donc si vous pouvez trouver un moyen d'éviter d'avoir le débogueur interrompre votre programme pour vérifier chacun d'eux, faire.

Si ce n'est pas faisable pour tout ce que vous essayez de déboguer, alors je vous recommande de poster une nouvelle question, vous décrivez le problème que vous êtes vraiment essayer de résoudre.

Autres conseils

Vous devrez passer à des options |Linker et vérifier "Débug DCus".Par défaut, cela n'est pas coché de sorte que le débogueur ne pénètre pas dans l'ensemble de la VCL lorsque vous essayez de travailler.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top