Il presente articolo è stato tradotto automaticamente.

Visual Studio 2015

Utilizzare IntelliTrace per diagnosticare i problemi più velocemente

Angelos Petropoulos

Pensare il tipico flusso di lavoro quando si sta debug. Fino a quando non correttamente identificato la causa radice di un problema, sei bloccato in un ciclo di impostare punti di interruzione e ripetendo i passaggi di sperimentazione che riproducono il problema. È ora possibile utilizzare IntelliTrace al record storico di informazioni di debug, come l'esecuzione dell'applicazione. Questo ti aiuta a spezzare questo ciclo. È possibile eseguire la procedura di prova una volta per riprodurre il problema, quindi utilizzare il debug storico per identificare la causa principale.

IntelliTrace è l'insieme di tecnologie di debug storici che estende il debugger in Visual Studio 2015 Enterprise. C'è anche un componente autonomo che è possibile utilizzare all'esterno Visual Studio. IntelliTrace registra la tua esecuzione di applicazione alla ricerca di eventi interessanti. Quando si verifica un evento interessante, IntelliTrace registra automaticamente lo stack di chiamate e le variabili locali mentre l'applicazione continua a funzionare. È possibile controllare gli eventi IntelliTrace ritiene "interessante" attraverso strumenti | Opzioni | IntelliTrace | Eventi IntelliTrace.

IntelliTrace si presenta con una storia di esecuzione dell'applicazione utilizzando una timeline (una panoramica degli eventi) e una tabella che visualizza i dettagli di ogni evento. Ti dà accesso a dati storici di debug di estendere e integrare con il debugger Visual Studio . Questo consente di tornare indietro nel tempo e vedere lo stack di chiamate e le variabili locali di eventi raccolti.

IntelliTrace ha trovato una nuova casa nella finestra strumenti diagnostici in Visual Studio 2015. Finestra diagnostica strumenti contiene gli strumenti di utilizzo della CPU e l'utilizzo della memoria, insieme con IntelliTrace. Se il tipo di progetto e configurazione di debug è supportato (per informazioni aggiornate, controlla aka.ms/diagtoolswindow), vedrete una finestra di strumenti diagnostici vengono visualizzati quando si avvia il debug in Visual Studio 2015 (è possibile premere F5 oppure sempre aprire manualmente utilizzando il Debug | Visualizza strumenti diagnostici). Quando si attiva il debug di storici, vedrete qualcosa di simile a Figura 1.

storica di debug con IntelliTrace
1 figura storica di debug con IntelliTrace

Esplorare l'interfaccia utente

Di seguito è riportato un elenco di ogni componente di IntelliTrace UI e la sua destinazione e funzionalità:

Eventi del debugger: Tabella dettagli eventi Debugger (vedere Figura 2) è una vista tabellare degli eventi IntelliTrace ha raccolto. Le colonne da sinistra a destra sono:

  1. Un puntatore all'evento per il quale il debugger attualmente sta mostrando informazioni; solo una riga avrà la freccia gialla che indica la posizione del puntatore all'istruzione corrente e una riga potrebbe avere una freccia rosa che indica quale evento storico che hai attivato.
  2. L'icona utilizzata per rappresentare questo evento sulla timeline eventi Debugger.
  3. Una breve descrizione dell'evento.
  4. Il numero di secondi dall'inizio della sessione di debug per il momento che l'evento è stato raccolto.
  5. La durata dell'evento. (Nota: Non tutti gli eventi hanno una durata).
  6. L'ID del thread e il nome che ha generato l'evento. (Nota: Non tutti gli eventi sono associati a un thread)

Tabella eventi Debugger di
Tabella eventi Debugger di figura 2

Se si fa clic su un evento nell'elenco per espanderlo, quindi può selezionare attivare il debug storico e impostare il debugger al punto dove IntelliTrace registrato l'evento selezionato.

Controllo del filtro di categoria: Questo controllo filtro consente di nascondere o visualizzare le categorie di eventi mentre si stanno ancora viene raccolto. Se si desidera concentrarsi su una particolare categoria o siete completamente disinteressato in un altro, è possibile utilizzare per portarli rapidamente dentro e fuori di vista. L'attuale elenco delle categorie include: ADO.NET ASP.NET, Console, associazione dati, Debugger, variabili di ambiente, eccezione, File, gesto, inizializzazione pigra, Output, Registro di sistema, servizio modello, filettature, tracciatura, Prompt utente e XAML.

Controllo del filtro di filettatura: Questo controllo filtro consente di visualizzare o nascondere gli eventi dal thread da cui essi sono stati generati, nel caso in cui siete solo interessati a diagnosticare un thread specifico o sei positivo l'esecuzione di un thread specifico non è problemi.

Visualizza gli eventi da codice esterno pulsante: IntelliTrace rispetta l'impostazione Just My Code del debugger. Questo significa che per impostazione predefinita nasconde gli eventi che provengono da codice non utente per ridurre il rumore. Cliccando su questo sarà ignorare l'impostazione del debugger e mostrare eventi da codice esterno. La maggior parte del tempo, questo porterà ad un output dettagliato.

Eventi Timeline del debugger: Questa è una visualizzazione grafica degli eventi che IntelliTrace ha raccolto nel corso del tempo. Questa è una visione diversa delle stesse informazioni riportate nella tabella eventi particolari. Utilizzare la timeline per ottenere una visualizzazione ad alto livello e identificare e selezionare le aree che si desidera forare con la visualizzazione tabella di eventi particolari. È possibile filtrare ciò che si vede nella tabella visualizzazione dettagli eventi selezionando un intervallo di tempo specifico.

Il sovrano: Sopra la timeline, c'è un sovrano che vi mostra il punto nel tempo in cui è avvenuto ciascun evento. Inoltre, consente di selezionare un intervallo di tempo specifico facendo clic e trascinando. Selezionare un intervallo di tempo per filtrare la tabella dettagli eventi Debugger.

Rompere la traccia di eventi: Ogni volta che si verifica un evento di rottura, appare su questa traccia della sequenza temporale. Pausa eventi stanno colpendo i punti di interruzione, passaggi completati, facendo clic su Interrompi tutto, richiamando il debugger o un'eccezione non gestita rompendo l'esecuzione. Pensate a questo come il maestro timeline traccia per aiutarti a Oriente dove eventi in altre tracce si sono verificati in esecuzione del programma (perché utilizzando i punti di interruzione e passi è come è possibile controllare l'esecuzione dell'applicazione). Cliccando su un evento in questa pista applica un filtro di tempo che consente di filtrare gli eventi nella tabella dettagli eventi Debugger. In questo modo è possibile filtrare facilmente solo quegli eventi che è accaduto quando fatto un passo sopra una riga di codice o tra voi premendo F5 e colpire un punto di interruzione.

Eventi uscita pista: Questo brano Mostra eventi per i messaggi che appaiono nella finestra di Output. Le categorie di eventi che appaiono su questa pista sono: Generate eccezioni, programmare l'uscita (o console. WriteLine), modulo caricato/scaricato, uscita Thread e processo. Ciò consente di correlare i messaggi di debug standard output con il resto delle informazioni storiche del debugger.

Evento IntelliTrace pista: Ogni categoria di eventi raccolto da IntelliTrace appare su questa traccia della sequenza temporale: ADO.NET ASP.NET, Console, associazione dati, le variabili di ambiente, File, gesto, l'inizializzazione differita, il registro di sistema, servizio, Threading modello, rintracciabilità, Prompt utente e XML.

Barra degli strumenti di diagnostica: La barra degli strumenti ti dà i tasti Zoom In e Zoom Out, così come un pulsante Reset per reimpostare il livello di zoom predefinito nella timeline e cancella qualsiasi selezione tempo esistente. Questo filtra tutti raccolti dati in vista. L'elenco a discesa selezionare strumenti consente di selezionare gli strumenti che piacerebbe inclusi nella finestra strumenti diagnostici, oltre a IntelliTrace.

Allo stesso tempo, è possibile eseguire molteplici strumenti diagnostici. La finestra strumenti diagnostici può ospitare l'utilizzo della memoria, strumenti di utilizzo della CPU e IntelliTrace tutti allo stesso tempo. Questo ti dà una visione olistica nel comportamento dell'applicazione. Ad esempio, Figura 3 dimostra come la serie di eventi di caricamento del modulo aumenta la memoria e l'utilizzo della CPU per un'applicazione ASP.NET come esso si avvia.

la finestra strumenti diagnostici Mostra come App è comportarsi ed eseguendo
Figura 3 la finestra strumenti diagnostici Mostra come App è comportarsi ed eseguendo

Correggere un Bug reale con IntelliTrace

Ora potrai camminare attraverso un bug reale utilizzando la funzionalità Live debug di IntelliTrace in Visual Studio 2015 Enterprise di fissaggio. Potrai debuggare l'applicazione è un'applicazione Windows Forms da CodeProject chiamato partite.

L'app gestisce un database dei membri di un club sociale. Il bug è che la ricerca si comporta in modo irregolare dopo la registrazione di un membro. Per riprodurre il bug, iniziare l'applicazione e registrare un nuovo membro. Poi io eseguire una ricerca di ottenere tutti che dovrebbe per restituire tutti i membri registrati. Mi aspetto solo un risultato, ma invece ho due (Vedi Figura 4). Il secondo risultato della ricerca è inaspettato, in modo che è quello che ho bisogno di risolvere.

ottenere tutti i risultati di ricerca contiene un Record inaspettato
Figura 4 ottenere tutti i risultati di ricerca contiene un Record inaspettato

Per risolvere questo bug, cosa dovrei fare? A questo punto, mia ipotesi sono che ci sia qualcosa di sbagliato con la funzione di ricerca ottenere tutti è o c'è qualcosa di sbagliato con il processo di registrazione nuovo membro. L'applicazione ha un'altra modalità di ricerca che accetta i criteri di ricerca specifici, così potrai usarlo per cercare inaspettato record restituito da ottenere tutto (quello con i dati mancanti e valori sconosciuti).

Ecco i possibili scenari: Se non ottengo nessun risultato, probabilmente significa il record inaspettato non esiste nel database e il problema è con la funzione di ricerca ottenere tutti. Se ottengo un risultato record di corrispondenza con ignoto per occupazione e StatoCivile, il problema è probabilmente con la funzione di registrazione inserendo più record nel database di quanto dovrebbe.

Così ora che eseguire una ricerca con ignoto per occupazione e sconosciuto per StatoCivile, che restituisce un solo risultato: il record che registrato con successo come ingegnere e sposato. Che è strano e, purtroppo, non ha ottenuto me avvicinarmi alla causa principale del bug. Invece di spendere i punti di interruzione impostazione tempo, registrazione di nuovi membri e cercando per loro più e più volte, vedrò come IntelliTrace può aiutare a velocizzare l'inchiesta.

Voglio vedere gli eventi che IntelliTrace ha raccolto, ma non vengono aggiornati gli eventi IntelliTrace fino a quando il Debugger interrompe l'esecuzione dell'applicazione (cioè che colpisce un punto di interruzione). Perché non ho un punto di interruzione specifico in cui sono interessato, clicca Interrompi tutto sulla barra degli strumenti Visual Studio . L'app è ora in uno stato di pausa con tutti i thread sospesi. IntelliTrace è la visualizzazione dei dati in che esso raccolti nella timeline e visualizzazione tabulare dettagli della finestra di strumenti diagnostici.

A questo punto, io ho interagito con l'applicazione un po da quando ho iniziato a debug. Ho loggato, registrato un nuovo membro, cercato utilizzando ottenere tutti e cercato con criteri di ricerca specifici. Tuttavia, mi interessa solo gli eventi che si sono verificati come risultato diretto di clic sul registro. Per filtrare il mio parere a solo questi eventi, passa sopra gli eventi sulla linea temporale finché trovo dove ho cliccato Register. Poi trascinare e selezionare un cluster di eventi. Quando guardo la mia vista dettagliata tabulare, dopo aver selezionato il tempo, posso vedere i due eventi più recenti elencati (altro che colpire Interrompi tutto) sono due istruzioni INSERT (vedere Figura 5).

visualizzazione tabulare dettagli viene filtrata per mostrare eventi dall'intervallo di tempo selezionato
Figura 5 visualizzazione tabulare dettagli viene filtrata per mostrare eventi dall'intervallo di tempo selezionato

Facendo clic su un evento nell'elenco si espande su più righe per visualizzare l'intera istruzione SQL. Vedo che ho due istruzioni INSERT accadendo. Quello secondo è l'inserimento di un record negativo con valori NULL. Qui ci sono le due istruzioni SQL:

Execute Reader "insert [dbo].[ClubMembers]([Name], [DateOfBirth],
  [Occupation], [Salary], [MaritalStatus], [HealthStatus], [NumberOfChildren],
  [ExpirationDate])values (@0, @1, @2, @3, @4, @5, @6, @7)
  select [Id] from [dbo].[ClubMembers] where @@ROWCOUNT > 0 and [Id] =
  scope_identity()"
Execute Reader "insert [dbo].[ClubMembers]([Name], [DateOfBirth],
  [Occupation], [Salary], [MaritalStatus], [HealthStatus], [NumberOfChildren],
  [ExpirationDate])values (null, @0, @1, null, @2, @3, null, @4) select [Id] from
  [dbo].[ClubMembers] where @@ROWCOUNT > 0 and [Id] = scope_identity()"

È possibile ignorare l'istruzione SELECT che segue l'inserto. Che è Entity Framework recupero l'ID del record che appena inserito. La domanda successiva è: Perché ottengo due istruzioni SQL eseguite per un singolo clic del pulsante registro? IntelliTrace mi aiuta a rispondere rapidamente a questa domanda di avermi permesso di attivare il debug storico per ciascuno degli eventi (vedere Figura 6) e controllando i loro rispettivi storica chiamata stack nella finestra Stack di chiamate.

attivare debug storica per la prima delle istruzioni INSERT due
Figura 6 attivare debug storica per la prima delle istruzioni INSERT due

Stack di chiamate storico il primo inserto è:

John.SocialClub.Data.dll!John.SocialClub.Data.Service.ClubMemberService.Create(...)
John.SocialClub.Desktop.exe!John.SocialClub.Desktop.Forms.Membership.Manage.RegisterMember()
John.SocialClub.Desktop.exe!John.SocialClub.Desktop.Forms.Membership.Manage.Register_Click(...)
John.SocialClub.Desktop.exe!John.SocialClub.Desktop.Program.Main()

Lo stack di chiamate storica del secondo inserto con il record negativo è:

John.SocialClub.Data.dll!John.SocialClub.Data.Service.ClubMemberService.Create(...)
John.SocialClub.Desktop.exe!John.SocialClub.Desktop.Forms.Membership.Manage.RegisterMember()
John.SocialClub.Desktop.exe!John.SocialClub.Desktop.Forms.Membership.Manage.btnRegister_MouseClick(...)
John.SocialClub.Desktop.exe!John.SocialClub.Desktop.Program.Main()

Cliccando su ogni fotogramma mi prende per la corrispondente riga di codice. Dopo aver esaminato i due stack di chiamata storica, io ho determinato che ho due gestori di eventi diversi, sottoscritti il clic sul pulsante stesso: Register_Click(...) e btnRegister_MouseClick(...). Leggendo il codice in quelle due funzioni, rapidamente dedurre che campi del form vengono reimpostate dopo ogni registrazione nuovo membro, il primo gestore di eventi inserisce i record al database correttamente. Tuttavia, il secondo gestore eventi inserisce un record con campi NULL e vuoti. Così rapidamente trovato il bug utilizzando Interrompi tutto e quindi utilizzato IntelliTrace per identificare e spostarsi nella parte incriminata di codice.

Se eventi IntelliTrace non sono abbastanza per trovare il Bug?

A questo punto, eccitato come sei circa IntelliTrace migliorare il modo di che debug, forse vi starete chiedendo che cosa fare se IntelliTrace non registra eventi interessanti che possono portare a causa di un bug. Sei fuori di fortuna? No, non lo sei. Don' t dimenticare che è possibile controllare quali eventi IntelliTrace sono attivati utilizzando strumenti | Opzioni | IntelliTrace | Eventi IntelliTrace. Non tutti sono abilitati per impostazione predefinita, ma anche tutti loro attivazione potrebbe non sempre essere sufficiente per alcuni bug fastidiosi.

Per tali questioni difficili, è possibile configurare IntelliTrace per registrare non solo eventi, ma anche ogni chiamata al metodo e i relativi parametri. Semplicemente vai su strumenti | Opzioni | IntelliTrace e selezionare eventi IntelliTrace e informazioni sulla chiamata. Questa è una potente funzionalità di debug, ma arriva a un costo di runtime. Con questa impostazione, IntelliTrace sarà ogni chiamata al metodo di intercettare e registrare, che influisce sulle prestazioni dell'applicazione. Ecco perché esso non raccolta le chiamate al metodo per impostazione predefinita. Devi optare attraverso impostazioni IntelliTrace.

È possibile visualizzare e navigare queste nuove informazioni in due modi diversi. È possibile utilizzare la scheda secondaria chiamate nella tabella dettagli eventi Debugger, che elenca le chiamate tutte registrate (per ulteriori informazioni sulla visualizzazione chiamate, vai a aka.ms/itracecalls). Un altro modo è quello di attivare il debug storico per un evento e utilizzare il controllo di IntelliTrace all'interno dell'editor di testo per spostarsi avanti e indietro nell'esecuzione dell'applicazione. I controlli appaiono tra il codice e il puntatore all'istruzione. Così IntelliTrace ha coperto per scenari di debug dal vivo.

Se si non può riprodurre il Bug su un computer dello sviluppatore?

Questo è dove Non-Live debug con IntelliTrace arriva. Finora, ho presuppone che sapete i passaggi necessari per riprodurre il problema che stai debug. Che non è sempre il caso. Alcuni dei bug più difficile e richiede molto tempo sono quelli per cui si potrebbe non avere la procedura esatta per riprodurre. IntelliTrace può eliminare questo temuto scenario "no repro" consentendo di registrare l'esecuzione dell'applicazione in un ambiente di produzione o di test. Poi si può eseguirne il debug sul computer di sviluppo, esplorando le informazioni raccolte utilizzando la stessa finestra di strumenti diagnostici che sto usando qui.

IntelliTrace offre un collezionista standalone che è possibile distribuire ad altri ambienti a cui Visual Studio non riesce a connettersi. Si non dovrebbe incontrare alcuna resistenza dal tuo amministratori perché non non c'è nessuna installazione coinvolti. Si tratta semplicemente di copiare il collettore in ambiente di destinazione. Il collezionista registra l'esecuzione dell'applicazione in un file iTrace che è possibile trasferire al computer di sviluppo e aprire con Visual Studio. Questo scenario è indicato come Non-Live debug perché non è possibile controllare l'esecuzione di app durante il debug. Per informazioni aggiornate su come usare il collezionista standalone IntelliTrace, si prega di visitare aka.ms/itracecollector.

Avvolgendo

La nuova esperienza di IntelliTrace e integrazione con la finestra strumenti diagnostici hanno alcuni eccitanti possibilità. Si può tenere aggiornati con le ultime informazioni su queste e altre funzionalità relative alla diagnostica andando a aka.ms/DiagnosticsBlog.


Petropoulos Angelos è un senior program manager del team di Visual Studio . Dopo aver ottenuto il suo padrone nell'ingegneria del software orientato agli oggetti, ha lavorato come consulente IT nel Regno Unito. Dopo essersi trasferito negli Stati Uniti, si unisce al team di strumenti diagnostici in Visual Studio ed ora è program manager per IntelliTrace.

Grazie ai seguenti esperti tecnici Microsoft per la revisione di questo articolo: Andrew Hall, Daniel Moth, Dan Taylor, Charles Willis