Dans Delphi, est OutputDebugString sûr de fil?
-
21-08-2019 - |
Question
est
OutputDebugString(PAnsiChar(''));
thread-safe?
I / nous utilisons dans les discussions pour le débogage, et il ne me suis jamais si je devrais le faisons d'une manière différente.
(Delphi 7)
La solution
Ne vous inquiétez pas, il est.
Quand OutputDebugString () est appelée par une application, il faut ces pas. Notez qu'un échec à tout moment abandonne la chose et traite la demande de mise au point en tant que no-op (la chaîne n'est pas envoyé nulle part).
- Ouvrir DBWinMutex et attendre jusqu'à ce que nous ayons accès exclusif.
- Carte du segment DBWIN_BUFFER en mémoire: si elle est introuvable, il n'y a pas débogueur en cours d'exécution si la demande est entièrement ignorée.
- Ouvrir les événements DBWIN_BUFFER_READY et DBWIN_DATA_READY. Comme avec le segment de mémoire partagée, les objets manquants signifie qu'aucun débogueur disponible.
- Attendez que l'événement DBWIN_BUFFER_READY à signaler: ce dit que la mémoire tampon ne soit plus en cours d'utilisation. La plupart du temps, cette événement sera signalé immédiatement quand il est examiné, mais il ne sera pas attendre plus de 10 secondes pour que le tampon soit prêt (un délai d'attente abandonne la demande).
- Copier jusqu'à environ 4 Ko de données dans la mémoire tampon de mémoire, et stocker le processus actuel ID là aussi. Toujours mettre un octet NUL à la fin de la chaîne.
- Dites-le débogueur que le tampon est prêt en réglant la événement DBWIN_DATA_READY. Le débogueur prend de là.
- Relâchez le mutex
- Fermez les objets de l'événement et la section, mais nous gardons la poignée le mutex autour pour plus tard.
Autres conseils
Eh bien, pas que ce n'est pas vrai, il est, mais juste pour que vous ne devez pas prendre tout mot Lieven pour elle:
Transfert des données entre le l'application et le débogueur est fait par l'intermédiaire d'un bloc de 4 Ko de mémoire partagée, avec un Mutex et deux objets de l'événement protéger l'accès. Voici les quatre objets noyau impliqués.
Comprendre Win32 OutputDebugString est un excellent article sur la question.
Je l'ai une fois eu du mal, cependant, avec des chaînes dans une DLL ISAPI. Pour une raison étrange, le booléen IsMultiThread défini dans System.pas n'a pas été défini!
Il a été à l'origine AccessViolations étrange, une fois que le fil est en cours d'exécution plus d'un fil ... Un simple « IsMultiThread: = true; » dans une unité d'initialisation réparée.