2010-11-23 10 views
5

Ho una chiamata "Debole" OutputDebugString nella mia applicazione che stampa "T", ma non riesco a individuarlo.Debug delle chiamate OutputDebugString in Delphi

È possibile in qualche modo impostare il punto di interruzione su OutputDebugString -function e vedere da dove viene chiamato?

sto utilizzando Delphi 2009.

risposta

13

Quante chiamate a OutputDebugString ci sono nel vostro progetto? Puoi utilizzare la finestra di dialogo "Trova nei file" per trovarli tutti e, se non sono troppi, non dovrebbe esserci un problema.

In caso contrario, è possibile, ovviamente, utilizzare una ricerca e sostituire e sostituire tutto OutputDebugString( con raise Exception.Create(.

Si potrebbe anche scrivere una funzione

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

in un'unità utilizzata da ogni altra unità nel progetto. Se solo questa nuova unità viene dichiarata dopo lo Windows.pas nell'elenco uses, verrà utilizzata questa nuova funzione al posto di quella di Windows.pas.

Aggiornamento

Sì, è possibile inserire i punti di interruzione all'interno Windows.pas. Per prima cosa, nel tuo progetto, vai su Opzioni progetto, e sotto Debug, seleziona "Usa DCU debug". Poi si può andare a Windows.pas e mettere un punto di interruzione alla linea di 30769:

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

Troppe distribuzioni su progetto e componenti .. Non sono nemmeno sicuro se il messaggio proviene da codice proprio o di terze parti. – Harriv

+0

Sì, esegue il debug della DCU. Ora ho solo bisogno di capire come impostare la condizione .. – Harriv

+2

se non è il tuo codice ma qualche unità che usi (indirettamente) la chiamata potrebbe anche andare a OutputDebugStringA. – Remko

7
  • eseguire l'applicazione.
  • Mettilo in pausa.
  • Finestra Apri/Debug di Windows/Moduli .
  • Cerca kernel32.dll. Doppio click.
  • Cerca OutputDebugStringA. Fai doppio clic su .
  • Si apre la finestra CPU. Impostare un punto di interruzione su prima riga.
  • Cerca OutputDebugStringW. Fai doppio clic su .
  • Si apre la finestra CPU. Impostare un punto di interruzione su prima riga.

Fatto.

Ora qualsiasi chiamata a OutputDebugString dall'applicazione verrà interrotta al punto di interruzione. È inoltre possibile attivare la registrazione delle proprietà del punto di interruzione per registrare lo stack di chiamate.