9

Voglio essere in grado di vedere un timestamp all'inizio di ogni traccia nella finestra di debug in Visual Studio.Finestra di debug di Visual Studio 2008 per visualizzare la data/ora?

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

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

esempio di questo è l'applicazione Sysinternals - DebugView. Il problema è che non riesco ad avere il debug di Visual Studio e ascolto con DebugView allo stesso tempo e non mi sento a mio agio nell'aggiungere manualmente il timestamp ai miei traccianti.

risposta

7

Poiché il testo della finestra di output è di sola lettura una volta scritto, non c'è un modo semplice per fare esattamente ciò che si vuole fare. Tuttavia, è facile fare qualcosa di simile: aggiungi una riga di timestamp dopo il il nuovo testo viene scritto nella finestra di output. Ciò renderà la finestra di output molto più disordinata, ma otterrai i tuoi tempi.

Ecco come potrebbe funzionare: Innanzitutto, creare un componente aggiuntivo di Visual Studio o una macro che agganci l'evento PaneUpdated del riquadro attivo della finestra di Outlook. (Vedere this thread per come farlo con un approccio Macro). Assicurati di controllare, nel gestore dell'evento, che sia pane.Name == "Debug" e ignori gli altri riquadri. In secondo luogo, quando si rileva il nuovo testo nel riquadro output di debug, aggiungere una linea di timestamp, in questo modo:

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"); 
} 

E 'anche possibile pre-pend un timestamp per ogni linea, ma è molto più difficile. Non è possibile modificare il testo già nella finestra Output (è di sola lettura), ma è possibile cancellare la finestra ed è possibile aggiungere del testo. Quindi potresti utilizzare lo stesso approccio di gestore eventi sopra per rilevare le modifiche del testo, ma invece di accodare potresti copiare il testo corrente, anteporre la data e ora a tutte le righe che non hanno già data e ora, svuotare la finestra e riaggiungere l'ora -with-timestamps testo. Il problema con questo è la prestazione una volta che la finestra di output diventa grande. Quindi probabilmente dovresti implementare una sorta di "lazy stamping" che fa il clear e lo inserisci in background, per evitare di uccidere il tuo IDE quando (come è comune) 100 di righe di output di debug vengono emesse in breve tempo . Inoltre, quando si cancella e si aggiunge nuovamente, se si sta selezionando il testo nella finestra di output, la selezione viene persa.

Personalmente, farei semplicemente la cosa più semplice e aggiungo le righe di timestamp piuttosto che il più difficile approccio pre-pendolo. Dato che roba alla fine della linea è difficile da vedere senza scorrere, probabilmente assicurerei che c'era una nuova riga prima del timestamp, quindi l'utente vedrebbe ogni batch di una o più righe di output seguite da una riga di timestamp.

È possibile che ci sia un modo per agganciare la finestra di output prima che venga visualizzato il testo, ma non è stato possibile trovare alcun punto di estensibilità di questo tipo nelle API di Extensibility VS.

Un'ultima idea: si può sempre stampare la propria finestra degli strumenti, ad es. "Ivan's Debug Output" che ascolta gli eventi provenienti dalla finestra di output reale ed echeggia le nuove righe (con timestamp) alla tua finestra degli strumenti. Questa è probabilmente l'opzione più difficile, ma dovrebbe fare esattamente quello che vuoi.

+0

@Justin stavo osservando che anche l'estensibilità. La fine della linea non è molto bella, poiché le linee hanno lunghezze diverse e sono molto difficili da leggere. Il ridipingere della finestra è un killer come dici tu ... Grazie per la tua risposta, ma sto davvero cercando di scoprire come farlo, anche se è un hacker. –

+0

Sì, anziché end-of-line, se si utilizza una soluzione solo-append, suggerirei di impostare il timestamp su una nuova riga-- questo raddoppia il conteggio delle righe della finestra di output, ma è migliore (IMHO) di avere timestamp sepolti a fine riga. Inoltre, potrebbe non essere nemmeno possibile piantare il testo alla fine della riga, se le nuove righe sono già state emesse nel documento prima di ottenere il controllo. –

+0

Un'ultima idea: puoi sempre stampare la tua finestra degli strumenti, ad es. "Ivan's Debug Output" che ascolta gli eventi provenienti dalla finestra di output reale ed echeggia le nuove righe (con timestamp) alla tua finestra degli strumenti. Questa è probabilmente l'opzione più difficile, ma dovrebbe fare esattamente quello che vuoi. –

2

Stavo cercando la stessa funzionalità. Un mio collega ha trovato la macro $TICK nel campo del messaggio, stampando i tick della "cpu" corrente.

Dai un'occhiata anche allo these tips from Simon Chapman.