Come eseguire il debug di una DLL di riferimento (con pdb)


132

Ho due soluzioni nel mio spazio di lavoro, ad esempio A e B.

La soluzione A è un vecchio progetto che ho finito di programmare qualche tempo fa. Nella soluzione B, ho bisogno di usare alcune classi della soluzione A. Per fare ciò, aggiungo un riferimento alla DLL di uno dei progetti nella soluzione A.

Il problema è quando provo a eseguire il debug. Voglio essere in grado di entrare anche nel codice di A. Visual Studio non è in grado di caricare il codice per queste classi ("Non esiste un codice sorgente disponibile per la posizione corrente") e posso solo visualizzare lo smontaggio, il che non è utile.

L'unico modo che conosco per eseguire il debug delle classi dalla soluzione A è eseguendo la soluzione B, scollegando tutti i processi (nella voce di menu Debug) e collegando il processo dalla soluzione A.

Tuttavia, questo è molto scomodo e posso solo eseguire il debug di A OR B contemporaneamente.

C'è un modo per consentire di entrare nel codice delle DLL referenziate (per le quali ho il codice sorgente)?


Soluzione: il mio errore è stato che pensavo che un progetto potesse far parte di un'unica soluzione. In effetti, un progetto può far parte di un numero qualsiasi di soluzioni.
Quando è necessario fare riferimento al vecchio progetto, è sufficiente aggiungere il progetto alla soluzione. Questo viene fatto facendo clic con il tasto destro del mouse sulla nuova soluzione in Esplora soluzioni> Aggiungi> Progetto esistente.
Quindi, sarai in grado di aggiungere il riferimento al progetto. Come altri hanno scritto, dovresti probabilmente evitare completamente l'uso dei riferimenti dll al tuo codice (o altro codice che potresti dover modificare e eseguire il debug).

Un ottimo riferimento a come progettare le soluzioni può essere trovato in MSDN .


Quel collegamento MSDN è un must per gli sviluppatori .net (indipendentemente dal controllo del codice sorgente utilizzato). Sono sorpreso di non averlo visto prima. Grazie!
Pat

I nuovi arrivati, se già si conosce riferimenti del progetto, e che non è un'opzione (ad esempio, è necessario eseguire il debug di un pacchetto NuGet), quindi ignorare la risposta accettata e andare direttamente a questo: stackoverflow.com/a/26029208/398630
BrainSlugs83

Risposte:


113

Se hai un riferimento al progetto , dovrebbe funzionare immediatamente.

Se si tratta di un riferimento a file (dll), è necessario che i simboli di debug (il file "pdb") si trovino nella stessa cartella della dll. Verifica che i tuoi progetti generino simboli di debug (proprietà del progetto => Build => Advanced => Output / Debug Info = full); e se hai copiato la dll, metti il ​​pdb con essa.

Puoi anche caricare i simboli direttamente nell'IDE se non vuoi copiare alcun file, ma è più lavoro.

L'opzione più semplice è usare i riferimenti al progetto!


3
Unfurtunately, penso che non sia possibile aggiungere il riferimento al progetto al progetto da un'altra soluzione (correggimi se sbaglio!).
Elad

7
@Elad, l'ho appena fatto. Aggiungi prima "progetto esistente" alla soluzione. Quindi aggiungere un riferimento al progetto facendo clic su Aggiungi riferimento al progetto. È possibile impostare i punti di interruzione nei file di progetto esistenti. Questo è carino perché i file non vengono copiati.
user420667

3
Ho un progetto DLL come riferimento al progetto ma il punto di interruzione all'interno viene ignorato.
Slavo

1
Sono stato effettivamente in grado di eseguire il debug di un assembly (release-) oggi che è stato aggiunto come riferimento al file. Buono per me, ma come è potuto succedere? MSVC2010, C #, (ASP) .NET 4.0, l'assembly di riferimento esiste come debug + release (ma solo il file di rilascio è stato aggiunto al progetto). Vorrei davvero chiarire questo.
Tobias81,

1
Per me funzionava un giorno ma poi il giorno successivo non funzionava (avendo DLL e file PDB). Tuttavia, premendo il pulsante "Svuota cache simboli" su Strumenti> Opzioni> Debug> Simboli è stato risolto.
Paul,

45

Ho avuto lo stesso problema. È quello che ho trovato:

1) assicurati che tutti i progetti utilizzino lo stesso Framework (questo è fondamentale!)

2) in Strumenti / Opzioni> Debug> Generale assicurarsi che "Abilita solo il mio codice (solo gestito) NON sia spuntato

3) in Strumenti / Opzioni> Debug> Simboli cancella tutti i simboli memorizzati nella cache, deseleziona ed elimina tutte le posizioni delle cartelle nella casella di riepilogo "Posizioni dei file di simboli (.pdb)" ad eccezione dei "Microsoft Symbol Server" predefiniti, ma deseleziona anche. Elimina anche tutti i percorsi statici nella casella di testo "Simboli cache in questa directory". Fai clic sul pulsante "Svuota cache simboli". Infine, assicurati che il pulsante di opzione "Solo moduli specificati" sia selezionato.

4) nel menu Build / Configuration Manager per tutti i progetti assicurarsi che la configurazione sia in modalità Debug.


3
Il mio problema era che i miei due progetti usavano frame .Net diversi: 4.0 e 4.5. Tx!
user627283

1) e 4) sono cruciali. Non dimenticare di compilare in modalità Debug e utilizzare lo stesso framework.
scott_f,

12

Un altro punto da tenere a mente, assicurarsi che le DLL di riferimento non siano installate nel GAC. Dopo il test, ho installato le mie dll nel GAC per eseguire test a livello di sistema. In seguito, quando ho dovuto eseguire nuovamente il debug del mio codice, non sono riuscito a entrare negli assiemi di riferimento fino a quando non li ho cancellati dal GAC.


2
GRAZIE! Questo era il mio problema. Non riesco a credere di non averlo capito: - / Pensavo che l'impostazione del riferimento al progetto avrebbe in qualche modo prevalso su ciò che era installato nel GAC.
Biliardo

Assolutamente! Questo è un ottimo punto. Anche se si dispone della stessa versione di .NET Framework, se si dispone di codice nel GAC quando si tenta di eseguire il debug, non colpirà il punto di interruzione se il file .PDB nel GAC è diverso da quello nella cartella del progetto. Una soluzione per questo è annullare l'annullamento della DLL, compilare e quindi reindirizzare l'assembly.
DigiOz Multimedia,

7

Passaggio 1: vai su Strumenti -> Opzioni -> Debug

Passaggio 2: deseleziona Abilita solo il mio codice

Passaggio 3: deselezionare Richiedi che il file di origine corrisponda esattamente alla versione originale

Passaggio 4: deselezionare Passaggio su Proprietà e Operatori


3

Avevo i *.pdbfile nella stessa cartella e utilizzavo le opzioni di Arindam , ma non funzionava ancora. Ho scoperto che dovevo abilitare Abilita debug del codice nativo che si trova in Proprietà progetto> Debug .


1
questa informazione dovrebbe essere inclusa nella risposta accettata. è quello che stavo cercando specificamente. grazie per la condivisione! +1
Heriberto Lugo,

2

Quando si desidera impostare un punto di interruzione nel codice sorgente di una DLL di riferimento, assicurarsi innanzitutto di disporre di un file pdb disponibile per esso. Quindi puoi semplicemente aprire il file del codice sorgente correlato e impostare un punto di interruzione laggiù. Non è necessario che il file di origine faccia parte della soluzione. Come spiegato in Come posso impostare un punto di interruzione nel codice di riferimento in Visual Studio?

È possibile rivedere i punti di interruzione attraverso la finestra dei punti di interruzione, disponibile tramite Debug -> Windows -> Punti di interruzione.

Questo approccio ha il vantaggio di non dover aggiungere un progetto esistente alla tua soluzione solo per scopi di debug, poiché lasciarlo fuori mi ha fatto risparmiare molto tempo di costruzione. Evidentemente, la costruzione di una soluzione con un solo progetto è molto più veloce della creazione di una soluzione con molti di essi.


1
Funziona solo se il file esterno in cui è stato posizionato il punto di interruzione corrisponde al percorso esatto nel PDB. (Ad esempio funziona solo se hai creato la DLL sul tuo computer.)
Josh M.

2

Assicurarsi che la DLL non sia registrata nel GAC. Visual Studio utilizzerà la versione nel GAC e probabilmente non avrà informazioni di debug.


1

Non voglio includere un progetto di libreria di classi esterna in alcune delle mie soluzioni, quindi passo negli assiemi che consumo in modo diverso.

Le mie soluzioni hanno una directory "Common Assembly" che contiene le mie DLL di altri progetti. Le DLL a cui faccio riferimento hanno anche i file PDB di accompagnamento per il debug.

Per eseguire il debug e impostare i punti di interruzione, ho impostato un punto di interruzione nell'origine dell'applicazione di consumo in cui sto chiamando un metodo o un costruttore dall'assemblaggio e quindi passo INTO (F11) la chiamata metodo / costruttore.

Il debugger caricherà il file sorgente dell'assembly in VS e in quel punto è possibile impostare nuovi breakpoint all'interno dell'assembly.

Non è semplice ma funziona se non si desidera includere un nuovo riferimento al progetto e si desidera semplicemente fare riferimento a un assembly condiviso.


0

Deve funzionare. Ero solito eseguire il debug di un file .exe e una dll allo stesso tempo! Quello che suggerisco è 1) Includi il percorso della dll nel tuo progetto B, 2) Quindi compila nel debug il tuo progetto A 3) Controlla che il percorso punti sul file A dll e de pdb .... 4) Dopo di che inizia il debug del progetto B e, se tutto va bene, sarai in grado di eseguire il debug in entrambi i progetti!


0

Il modo più diretto che ho trovato utilizzando VisualStudio 2019 per eseguire il debug di una libreria esterna a cui si fa riferimento in NuGet, consiste nel seguire i seguenti passaggi:

  1. Strumenti> Opzioni> Debug> Generale> Deseleziona "Abilita solo il mio codice"

  2. Andare a Explorer Explorer> Apri dalla cache dei pacchetti NuGet Voce di elenco

  3. Digitare il nome del pacchetto NuGet che si desidera eseguire il debug nel campo di ricerca e fare clic su "OK" inserisci qui la descrizione dell'immagine

  4. Da Assembly Explorer, fai clic con il pulsante destro del mouse sull'assembly importato e seleziona "Genera Pdb" inserisci qui la descrizione dell'immagine

  5. Selezionare un percorso personalizzato in cui si desidera salvare il file .PDB e il framework per cui si desidera che questo venga generato

    inserisci qui la descrizione dell'immagine

  6. Copia il file .PDB dalla cartella generata nella cartella Debug e ora puoi impostare i punti di interruzione sul codice della libreria di questo assembly


Sembra buono, tranne che non riesco a trovare alcun Assembly Explorer; non è questa parte di Resharper?
Robert Massa,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.