2009-02-03 25 views

risposta

18

Non preoccuparti, lo è.

Quando OutputDebugString() viene chiamato da un'applicazione, prende questi passaggi . Si noti che un errore in qualsiasi momento abbandona il tutto e considera la richiesta di debug come non operante (la stringa non viene inviata in qualsiasi momento ).

  1. Aprire DBWinMutex e attendere fino a quando non abbiamo accesso esclusivo ad esso.
  2. Mappare il segmento DBWIN_BUFFER in memoria: se non viene trovato, non è in esecuzione alcun debugger in modo che l'intera richiesta venga ignorata.
  3. Apre gli eventi DBWIN_BUFFER_READY e DBWIN_DATA_READY. Come con il segmento di memoria condivisa, gli oggetti mancanti significano che nessun debugger è disponibile .
  4. Attendere la segnalazione dell'evento DBWIN_BUFFER_READY: questo dice che il buffer di memoria non è più in uso. La maggior parte delle volte, questo evento verrà segnalato immediatamente quando viene esaminato, ma non sarà attendere più di 10 secondi affinché il buffer diventi pronto (un timeout abbandona la richiesta).
  5. Copiare fino a circa 4kbyte di dati nel buffer di memoria e memorizzare l'ID di processo corrente anche lì. Inserisci sempre un byte NUL alla fine della stringa.
  6. Comunicare al debugger che il buffer è pronto impostando l'evento DBWIN_DATA_READY. Il debugger lo prende da lì.
  7. Rilasciare il mutex
  8. Chiudere gli oggetti Evento e Sezione, sebbene manterremo l'handle su mutex per dopo.
+0

Grazie, proprio quello che volevo sentire :) –

26

Beh, non che non è vero, lo è, ma solo in modo che non si deve prendere solo parola Lieven per esso:

Passaggio di dati tra il applicazione e il debugger è fatto tramite un blocco da 4kbyte di memoria condivisa, con un Mutex e due oggetti Event che proteggono l'accesso ad esso. Questi sono gli oggetti del kernel coinvolti.

Understanding Win32 OutputDebugString è un articolo eccellente sull'argomento.

+0

Sapevo che era sicuro perché una volta dovevo cercarlo da solo. Non conoscevo più l'intera storia dietro di esso. Grazie per averlo chiarito. –

2

Ho avuto problemi una volta, però, con le stringhe in una DLL ISAPI. Per qualche strana ragione il booleano IsMultiThread definito in System.pas non è stato impostato!

Stava causando strane AccessViolations, una volta che il thread stava eseguendo più di un thread ... Un semplice "IsMultiThread: = true;" in un'inizializzazione dell'unità è stato risolto.

+0

@Stijn, quale versione di Delphi era questa? Quando interrompo la mia app Delphi 2007, l'IDE mostra questa variabile come 'true'. – rossmcm