9

Ich möchte einen Zeitstempel am Anfang jeder Ablaufverfolgung im Debug-Fenster in Visual Studio sehen können.Visual Studio 2008 Debug-Fenster zum Anzeigen von Zeitmarken?

[Time stamp here] The thread 'Win32 Thread' (0xcd0) has exited with code 0 (0x0). 

[Time stamp here] => CLR ProvideAssembly: AppDomainId: 1, Ref: 'msvcm90d... 

Beispiel hierfür ist die sysinternals Anwendung - Debugview. Das Problem ist, dass ich Visual Studio nicht gleichzeitig debuggen kann und gleichzeitig mit DebugView zuhören kann, und es ist mir unangenehm, den Zeitstempel manuell zu meinen Tracern hinzuzufügen.

Antwort

7

Da der Text des Ausgabefensters schreibgeschützt ist, gibt es keine einfache Möglichkeit, genau das zu tun, was Sie tun möchten. Es ist jedoch leicht, etwas Ähnliches zu tun: eine Zeitmarke Zeile anhängen, nachdem neuer Text in das Ausgabefenster geschrieben wird. Dadurch wird das Ausgabefenster viel unordentlicher, aber Sie erhalten Ihre Zeitpläne.

So würde das funktionieren: Erstellen Sie zuerst ein Visual Studio-Add-In oder Makro, das das Ereignis PaneUpdated des aktiven Fensters des Outlook-Fensters hakt. (Siehe hierzu this thread für die Vorgehensweise mit einem Makro-Ansatz). Überprüfen Sie im Ereignishandler, dass pane.Name == "Debug" und andere Bereiche ignorieren. Zweitens, wenn Sie neuen Text in dem Debug-Ausgabebereich erfassen, einen Zeitstempel Linie, wie diese anfügen:

public void AddTimestamp(DTE2 dte) 
{ 
    // Retrieve and show the Output window. 
    OutputWindow outWin = dte.ToolWindows.OutputWindow; 

    pane = outWin.OutputWindowPanes.Item("Debug"); 
    } 
    catch 
    { 
     pane = outWin.OutputWindowPanes.Add("Debug"); 
    } 

    pane.OutputString("[timestamp: " + DateTime.Now.ToString() + "]\n"); 
} 

Es ist auch möglich, Pre-pend einen Zeitstempel auf jede Zeile, aber es ist viel schwieriger. Sie können den Text nicht bereits im Ausgabefenster ändern (er ist schreibgeschützt), Sie können jedoch das Fenster löschen und Text hinzufügen. Sie können also den gleichen Event-Handler-Ansatz verwenden, um Textänderungen zu erkennen, aber anstatt anzuhängen, können Sie den aktuellen Text kopieren, Zeitstempel auf Zeilen ohne Timestamps setzen, das Fenster löschen und das Jetzt neu hinzufügen -mit-Zeitstempel Text. Das Problem damit ist die Leistung, sobald das Ausgabefenster groß wird. Sie müssen also wahrscheinlich eine Art "faulen Stamping" implementieren, die das Löschen und Einfügen in den Hintergrund ausführt, um zu vermeiden, dass Ihre IDE, wenn (wie üblich) Hunderte von Debug-Ausgaben in kurzer Zeit ausgegeben werden . Wenn Sie Text löschen und erneut hinzufügen, wenn Sie gerade Text im Ausgabefenster auswählen, ist Ihre Auswahl verloren.

Persönlich würde ich einfach die einfache Sache machen und Zeitmarkenzeilen anhängen, anstatt den härteren Vor-Anhängungsansatz. Da das Material am Ende der Zeile ohne Scrollen kaum zu sehen ist, würde ich wahrscheinlich sicherstellen, dass vor dem Zeitstempel eine neue Zeile steht, so dass der Benutzer jeden Stapel einer oder mehrerer Ausgabezeilen mit einer Zeitmarke sehen würde.

Es ist möglich, dass es möglich ist, das Ausgabefenster anzuhängen, bevor Text angezeigt wird, aber ich konnte keinen solchen Erweiterungspunkt in den VS-Erweiterbarkeits-APIs finden.

Noch eine Idee: Sie könnten immer Ihr eigenes Werkzeugfenster, z. "Ivan's Debug Output", der die Ereignisse aus dem echten Ausgabefenster abhört und neue Zeilen (mit Zeitstempeln) in Ihr eigenes Werkzeugfenster zurückgibt. Dies ist wahrscheinlich die schwierigste Option, sollte aber genau das tun, was Sie wollen.

+0

@Justin Ich schaute auch auf diese Erweiterbarkeit. Das Ende der Zeile ist nicht sehr schön, da Zeilen unterschiedliche Längen haben und sehr schwer zu lesen sind. Die Neulackierung des Fensters ist ein Mörder, wie du sagst ... Danke für deine Antwort, aber ich bin wirklich auf der Suche nach dem, wie man das macht, selbst wenn es hackisch ist. –

+0

Ja, statt End-of-Line, wenn Sie mit einer Append-only-Lösung gehen, würde ich vorschlagen, den Zeitstempel auf eine neue Zeile zu pflanzen - dies verdoppelt die Zeilenanzahl des Ausgabefensters, ist aber besser (IMHO) als Zeitstempel am Ende der Zeile begraben zu haben. Außerdem ist es möglicherweise nicht möglich, den Text am Ende der Zeile zu platzieren, wenn die Zeilenumbrüche bereits in das Dokument ausgegeben wurden, bevor Sie die Kontrolle übernehmen. –

+0

Eine weitere Idee: Sie könnten immer Ihr eigenes Werkzeugfenster, z. "Ivan's Debug Output", der die Ereignisse aus dem echten Ausgabefenster abhört und neue Zeilen (mit Zeitstempeln) in Ihr eigenes Werkzeugfenster zurückgibt. Dies ist wahrscheinlich die schwierigste Option, sollte aber genau das tun, was Sie wollen. –

2

Ich suchte nach der gleichen Funktionalität. Kollege von mir kam mit dem $TICK Makro in das Mitteilungsfeld und druckte die "aktuellen" CPU-Ticks aus.

Schauen Sie sich auch these tips from Simon Chapman an.