2012-03-08 9 views
12

Supponiamo che abbia una funzione che genera un'eccezione. Supponiamo che questa funzione sia chiamata da una DLL di terze parti e la DLL di terze parti gestirà l'eccezione che ho lanciato.Cosa considera Visual Studio "Codice utente"?

Se Visual Studio decide che la DLL di terze parti non è "codice utente" (come si vede nell'immagine qui sotto), per impostazione predefinita si fermerà alla mia eccezione, anche se verrà gestita in seguito. Non è esattamente sbagliato farlo; spiega chiaramente che l'eccezione era non gestita dal codice utente. Ma cos'è che rende Visual Studio chiamata "codice utente" DLL e altri no?

enter image description here

Ho avuto una teoria che questo accade perché i simboli non vengono caricati, ma ci sono moduli nella lista che sono caricati simboli, ma non sono ancora considerati "codice utente".

+0

Per gli altri la finestra Moduli si trova nel menu Debug, scegliere Windows, quindi fare clic su Moduli. Un display utile per rintracciare cosa viene usato .dll (il mio codice non eseguirà il debug perché stava usando una copia della lib nel GAC piuttosto che l'output dal progetto di riferimento), grazie per averlo indicato. – RyanfaeScotland

risposta

12

Sì, senza un file .pdb il debugger non può stabilire se si tratta di un codice utente o meno. Si è spiegato abbastanza bene nel MSDN article:

Per distinguere il codice utente dal codice non-utente, Just My Code guarda tre cose: DBG, file PDB, e ottimizzazione.

In una configurazione di debug standard, l'ottimizzazione viene disattivata e vengono creati i simboli di debug per tutti i moduli. Quando si esegue una build di debug, tali moduli sono considerati come codice utente. Se chiamo una funzione di libreria che è ottimizzata e non ha simboli di debug, tuttavia, non è un codice utente. Just My Code impedisce che l'esecuzione si fermi ai punti di interruzione nel codice della libreria, che di solito non è il codice a cui sei interessato nel debug. Nella finestra Punti di interruzione, tali punti di interruzione verranno visualizzati con l'icona Punto di interruzione disabilitato.

+0

Questo è perfetto. Con questo in mente, ho postato una risposta per [impedire che il debugger si fermi su tutte le eccezioni in una libreria] (http://stackoverflow.com/a/9616890/33080) e ho aggiunto [un'altra soluzione per "Assert.Throws" di NUnit 'stop] (http://stackoverflow.com/a/9609494/33080). Bello! –

+0

Questo è ancora vago. Immagino sia sicuro dire "Codice utente = Nessun ottimizzazione + simboli di debug"? –

Problemi correlati