Cómo depurar un dll referenciado (que tiene pdb)

132

Tengo dos soluciones en mi espacio de trabajo, digamos A y B.

La solución A es un proyecto anterior que terminé de codificar hace algún tiempo. En la solución B, necesito usar algunas clases de la Solución A. Para hacerlo, agrego una referencia a la dll de uno de los proyectos en la solución A.

El problema es cuando intento depurar. Quiero poder entrar en el código de A también. Visual Studio no puede cargar el código para estas clases ("No hay código fuente disponible para la ubicación actual") y solo puedo ver el desmontaje, lo que no es útil.

La única forma en que sé depurar clases de la solución A es ejecutando la solución B, desconectar todos los procesos (en el elemento del menú Depurar) y adjuntar el proceso de la solución A.

Sin embargo, esto es muy inconveniente y solo puedo depurar A o B a la vez.

¿Hay alguna manera de permitir entrar en el código de dlls referenciados (para lo cual sí tengo el código fuente)?


Solución: Mi error fue pensar que un proyecto solo puede ser parte de una única solución. De hecho, un proyecto puede ser parte de cualquier cantidad de soluciones.
Cuando necesite hacer referencia al proyecto anterior, simplemente debe agregar el proyecto a la solución. Esto se hace haciendo clic derecho en la nueva solución en el Explorador de soluciones> Agregar> Proyecto existente.
Luego, podrá agregar la referencia del proyecto. Como otros escribieron, probablemente debería evitar por completo el uso de referencias dll a su propio código (u otro código que necesite cambiar y depurar).

Se puede encontrar una muy buena referencia sobre cómo se deben diseñar las soluciones en MSDN .

Elad
fuente
Ese enlace de MSDN es una lectura obligada para los desarrolladores de .net (independientemente del control de origen que utilicen). Me sorprende no haberlo visto antes. ¡Gracias!
Pat
Los recién llegados, si ya conocen referencias de proyectos, y esa no es una opción (por ejemplo, necesitan depurar un paquete NuGet), ignoren la respuesta aceptada y vayan directamente a esta: stackoverflow.com/a/26029208/398630
BrainSlugs83

Respuestas:

113

Si tiene una referencia de proyecto , debería funcionar de inmediato.

Si se trata de una referencia de archivo (dll), necesita que los símbolos de depuración (el archivo "pdb") estén en la misma carpeta que el dll. Verifique que sus proyectos estén generando símbolos de depuración (propiedades del proyecto => Build => Advanced => Output / Debug Info = full); y si ha copiado el dll, coloque el pdb con él.

También puede cargar símbolos directamente en el IDE si no desea copiar ningún archivo, pero es más trabajo.

¡La opción más fácil es usar referencias de proyecto!

Marc Gravell
fuente
3
Desafortunadamente, creo que no es posible agregar referencia de proyecto a proyecto desde otra solución (¡corríjame si me equivoco!).
Elad
77
@Elad, acabo de hacer esto. Primero agregue "proyecto existente" a la solución. Luego agregue una referencia al proyecto haciendo clic en agregar referencia de proyecto. Puede establecer los puntos de interrupción en los archivos de proyecto existentes. Esto es bueno porque los archivos no se copian.
user420667
3
Tengo el proyecto DLL como referencia del proyecto, pero se ignora el punto de interrupción.
Eslavo
1
De hecho, pude depurar un ensamblaje (release-) hoy que se agregó como referencia de archivo. Bien por mí, pero ¿cómo sucedió eso? MSVC2010, C #, (ASP) .NET 4.0, el ensamblado al que se hace referencia existe como depuración + versión (pero solo se agrega el archivo de versión al proyecto). Realmente me gustaría aclarar esto.
Tobias81
1
Para mí, funcionaba un día, pero al día siguiente no funcionaba (con archivos DLL y archivos PDB). Sin embargo, al presionar el botón "Vaciar caché de símbolos" en Herramientas> Opciones> Depuración> Símbolos se solucionó.
Paul
45

Tuve el mismo problema. Él es lo que encontré:

1) asegúrese de que todos los proyectos estén usando el mismo Marco (¡esto es crucial!)

2) en Herramientas / Opciones> Depuración> General, asegúrese de que "Activar solo mi código (solo administrado) NO esté marcado

3) en Herramientas / Opciones> Depuración> Símbolos, borre todos los símbolos almacenados en caché, desmarque y elimine todas las ubicaciones de carpeta en el cuadro de lista "Ubicaciones de archivo de símbolos (.pdb)", excepto los "Servidores de símbolos de Microsoft" predeterminados, pero aún no lo marque. Elimine también cualquier ruta estática en el cuadro de texto "Símbolos de caché en este directorio". Haga clic en el botón "Vaciar caché de símbolos". Finalmente, asegúrese de que el botón de opción "Solo módulos especificados" esté marcado.

4) en el menú Administrador de compilación / configuración para todos los proyectos, asegúrese de que la configuración esté en modo de depuración.

scott_f
fuente
3
Mi problema fue que mis dos proyectos utilizaron .Net Frameworks diferentes: 4.0 y 4.5. Tx!
user627283
1) y 4) son cruciales. No olvides construir en modo de depuración y usar el mismo marco.
scott_f
12

Otro punto a tener en cuenta, asegúrese de que los dlls referenciados no estén instalados en el GAC. Después de la prueba, instalé mis dlls en el GAC para hacer pruebas a nivel del sistema. Más tarde, cuando tuve que depurar mi código nuevamente, no pude ingresar a los ensambles referenciados hasta que los eliminé del GAC.

KevinHou
fuente
2
¡GRACIAS! Este fue mi problema. No puedo creer que no haya resuelto esto: - / Pensé que establecer la referencia del proyecto de alguna manera anularía lo que estaba instalado en el GAC.
SnookerC
¡Absolutamente! Este es un punto MUY bueno. Incluso si tiene la misma versión de .NET Framework, si tiene código en el GAC cuando intenta depurar, no alcanzará el punto de interrupción si el archivo .PDB en el GAC es diferente del que está en la carpeta de su proyecto. Una solución para esto es quitar el GAC de la DLL, compilar y luego volver a GAC ​​del ensamblaje.
DigiOz Multimedia
7

Paso 1: vaya a Herramientas -> Opción -> Depuración

Paso 2: desmarca Habilitar solo mi código

Paso 3: desmarque Requerir que el archivo de origen coincida exactamente con la versión original

Paso 4: desmarque Paso sobre propiedades y operadores

Arindam Dhar
fuente
3

Tenía los *.pdbarchivos en la misma carpeta y utilicé las opciones de Arindam , pero todavía no funcionaba. Resulta que necesitaba habilitar Habilitar la depuración de código nativo que se puede encontrar en Propiedades del proyecto> Depuración .

Roald
fuente
1
esta información debería haberse incluido en la respuesta aceptada. es lo que estaba buscando específicamente. ¡gracias por compartir! +1
Heriberto Lugo
2

Cuando desee establecer un punto de interrupción en el código fuente de una dll referenciada, primero asegúrese de tener un archivo pdb disponible. Luego, solo puede abrir el archivo de código fuente relacionado y establecer un punto de interrupción allí. El archivo fuente no necesita ser parte de su solución. Como se explica en ¿Cómo puedo establecer un punto de interrupción en el código referenciado en Visual Studio?

Puede revisar sus puntos de interrupción a través de la ventana de puntos de interrupción, disponible a través de Depuración -> Windows -> Puntos de interrupción.

Este enfoque tiene el beneficio de que no es necesario que agregue un proyecto existente a su solución solo para fines de depuración, ya que dejarlo afuera me ha ahorrado mucho tiempo de construcción. Evidentemente, crear una solución con un solo proyecto es mucho más rápido que crear una solución con muchos de ellos.

Carl en t Veld
fuente
1
Esto solo funciona si el archivo externo donde colocó el punto de interrupción coincide con la ruta exacta en el PDB. (Por ejemplo, solo funciona si compiló la DLL en su máquina).
Josh M.
2

Asegúrese de que su DLL no esté registrada en el GAC. Visual Studio usará la versión en el GAC y probablemente no tendrá información de depuración.

Guillermo Prandi
fuente
1

No quiero incluir un proyecto de biblioteca de clase externa en algunas de mis soluciones, así que me meto en ensamblajes que consumo de una manera diferente.

Mis soluciones tienen un directorio "Ensamblados comunes" que contiene mis propios archivos DLL de otros proyectos. Las DLL a las que me refiero también tienen sus archivos PDB para la depuración.

Para depurar y establecer puntos de interrupción, configuro un punto de interrupción en la fuente de la aplicación de consumo donde llamo a un método o constructor desde el ensamblaje y luego paso a (F11) la llamada al método / constructor.

El depurador cargará el archivo fuente del ensamblaje en VS y en ese punto se pueden establecer nuevos puntos de interrupción dentro del ensamblaje.

No es sencillo, pero funciona si no desea incluir una nueva referencia de proyecto y simplemente desea hacer referencia a un ensamblado compartido.

Jeff LaFay
fuente
0

Debe funcionar ¡Solía ​​depurar un archivo .exe y un dll al mismo tiempo! Lo que sugiero es 1) Incluir la ruta de la dll en su proyecto B, 2) Luego compilar para depurar su proyecto A 3) Controlar que la ruta apunta en el archivo A dll y de pdb ... 4) Después de eso comience a depurar el proyecto B y si todo está bien, ¡podrá depurar en ambos proyectos!

Matthieu
fuente
0

La forma más directa que encontré al usar VisualStudio 2019 para depurar una biblioteca externa a la que hace referencia en NuGet es mediante los siguientes pasos:

  1. Herramientas> Opciones> Depuración> General> Desmarque 'Habilitar solo mi código'

  2. Vaya al Explorador de ensamblajes> Abrir desde la caché de paquetes NuGet Elemento de la lista

  3. Escriba el nombre del paquete NuGet que desea depurar en el campo de búsqueda y haga clic en 'Aceptar' ingrese la descripción de la imagen aquí

  4. Desde el Explorador de ensamblajes, haga clic derecho en el ensamblado importado y seleccione 'Generar Pdb' ingrese la descripción de la imagen aquí

  5. Seleccione una ruta personalizada donde desee guardar el archivo .PDB y el marco para el que desea que se genere

    ingrese la descripción de la imagen aquí

  6. Copie el archivo .PDB de la carpeta generada en su carpeta de depuración y ahora puede establecer puntos de interrupción en el código de biblioteca de este ensamblado

magicode118
fuente
Suena bien, excepto que no puedo encontrar ningún Explorador de ensamblajes; ¿No es esta parte de Resharper?
Robert Massa