2012-06-27 9 views
11

Desidero utilizzare OutputDebugString() nella mia applicazione e quindi avere l'opzione di mostrarlo in un visualizzatore separato quando l'applicazione viene distribuita nel campo.Come visualizzare l'output di OutputDebugString?

Vale a dire, non voglio dover cambiare un flag e ricostruire il mio .exe per attivare e disattivare il debug.

Googling in giro, sembra che DebugView dovrebbe gestirlo, ma né, né TraceTool mostrare alcun output da questo codice.

unit Unit1; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; 

type 
    TForm1 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 


procedure TForm1.FormCreate(Sender: TObject); 
begin 
    OutputDebugString(PChar('Hello, wurld')); 
end; 

end. 

Ho letto la documentazione, senza alcun risultato, e vedere che altri hanno avuto problemi simili, ma non hanno inviato una soluzione.

C'è una soluzione?

+3

[GExperts] (http://gexperts.org) ha un visualizzatore di debug e un'unità che aggiungi alla tua app che farà questo per te, anche in XE2.Vedi l'unità 'DebugIntf' e l'applicazione' GExpertsDebugWindow.exe' che include. Funzionano con XE2 Starter (e praticamente tutte le altre versioni di Delphi). –

+0

+1 Verificherò http://www.gexperts.org/tour/index.html?debug_window.html – Mawg

+0

Se la postassi come risposta, probabilmente la assegnerei, nonostante l'aiuto in sterline di @RRUZ Questo è la soluzione con cui andrò - FOR EXE2 STARTER edition. Sembra essere l'unica soluzione che funziona sia dentro che fuori l'IDE. Per le altre edizioni, potrei preferire le grandiose ropzioni di TraceToool, ma Gexperts sembra più che soddisfacente per le mie esigenze. – Mawg

risposta

9

GExperts ha un visualizzatore di debug e un'unità che aggiungi alla tua applicazione che farà questo per te, anche in XE2 Starter. Vedere l'unità DebugIntf e l'applicazione GExpertsDebugWindow.exe che include. Funzionano con XE2 Starter (e praticamente tutte le altre versioni di Delphi).

GExperts include anche tonnellate di altri miglioramenti di IDE e editor che sono grandiosi e, naturalmente, sono in circolazione da sempre, quindi sono strumenti abbastanza solidi.

+0

Non funziona su un PC che non ha mai installato Delphi (non riesce a trovare RTL60.BPL). Ho pubblicato la mailing list di GExperts, ma così mfar non ha avuto risposta. – Mawg

+0

È costruito con pacchetti di runtime. Se il numero di versione nella BPL che date non è un refuso (penso che dovrebbe essere 160, non 60), avete installato una versione molto anticipata (60 erano intorno a Delphi 6, IIRC). Se è 160, lo puoi trovare nella cartella Windows \ System32 e metterlo nella stessa cartella in cui hai messo l'eseguibile del debug viewer. È una delle librerie di runtime distribuibili di Delphi, quindi è possibile spedirla con l'app. Avrai bisogno anche di VCL160 e VCLX160. –

+1

Oops, erano davvero 160, non 60. Avevo già copiato quella BPL, ma non sapevo di copiare gli altri due. Funziona bene Grazie, come sempre, per il tuo eccellente aiuto. – Mawg

23

Lo strumento DebugView funziona correttamente; assicurati di avviare la tua applicazione direttamente (senza l'IDE Delphi o un altro debugger collegato).

In ogni caso, il modo naturale di visualizzare l'output OutputDebugString per un'applicazione Delphi consiste nell'utilizzare l'IDE Delphi e la finestra Event Log.

Enter image description here

Enter image description here

+1

+1 puoi confermare che XE2 starter edition non ha un visualizzatore di log eventi? http://www.embarcadero.com/products/delphi/delphi-feature-matrix sembra indicare così. Presumibilmente, quindi, non riesco a visualizzare il mio output dall'IDE, ma solo quando lo eseguo da solo? – Mawg

+4

Non riesco a credere quale Windows 'Log eventi' non faccia parte dell'edizione Delphi Starter :( – RRUZ

+1

Ma sembra così nella funzione matix, giusto? E non riesco a trovarlo sul menu ... – Mawg

5

CnWizards contiene uno strumento, CnDebugViewer.exe, che può catturare OutputDebugString (dovrebbe essere eseguito come amministratore in Windows   7).

Non come DbgView, CnDebugViewer può creare schede separate per diverse applicazioni.

CnPack contiene un'unità, CnDebug.pas. Utilizzando questa unità, è possibile tracciare oggetti, raccolte, eccezioni, memdump, ecc. Con CnDebug.pas, è anche possibile impostare se avviare automaticamente CnDebugViewer, se eseguire il dump su file durante l'invio di messaggi di debug, ecc.

+1

+1 Maggiori informazioni su http://www.cnpack.org/showdetail.php?id=715&lang=en – Mawg

+0

@shenloqi, Hmm ... qualcuno ha verificato che il codice sorgente fosse *** pulito ***? Di solito non mi fido di questi strumenti dalla Cina. – Pacerier

4

Un problema con l'utilizzo di OutputDebugString è che altri programmi potrebbero anche utilizzarlo, ingombrando il registro: Debugging OutputDebugString calls in Delphi.

È possibile utilizzare CodeSite Express, di cui siamo stati molto contenti nell'uso quotidiano: http://www.raize.com/devtools/codesite/Default.asp.

+1

Questo è solo un problema se si utilizza uno strumento che raccoglie intenzionalmente messaggi da altri programmi e quindi non offre alcun modo per filtrarli. I normali debugger non avranno questo problema perché "OutputDebugString" di solito invia solo messaggi al singolo programma che lo esegue debug.Lo strumento SysInternals utilizza una tecnica diversa e non standard per la raccolta dei messaggi senza diventare un debugger per tutti i processi. Ma consente anche il filtraggio. Quindi non c'è davvero alcun problema. –

+1

Codice sito non sembra essere libero :-( – Mawg

+0

CS Express è incluso in XE2 e XE3. Sto usando la versione completa per anni, strumento eccezionale, molto più utile di quanto possa apparire a prima vista. – casterle

2

Nella mia versione di XE5, ho dovuto attivare l'opzione "Messaggi in uscita" sotto:

Strumenti> Opzioni> Opzioni Debugger> Registro eventi

non ricordo disabilitarlo.

Problemi correlati