¿Cómo se habilita la opción "Habilitar el paso de fuente de .NET Framework"?

118

Actualización 22 de febrero de 2013 : La entrada de Microsoft Connect tiene una nota de Alok Shriram (Administrador de programas, Bibliotecas de clase base, .NET Framework) de que el problema ahora debería resolverse. La entrada Connect está marcada como Resuelta (Fija) :

Este problema debería solucionarse ahora. Publicamos una actualización de las fuentes de referencia. Háganos saber en caso de que su problema aún no se haya solucionado.

Año y medio.

Enlaces de bonificación

Pregunta original

¿Cómo habilito el paso de fuente de .NET Framework en Visual Studio 2010?


Nota : esta pregunta es una parte de un todo más amplio:


Visual Studio 2010 viene con una nueva característica:

  • Herramientas, Opciones, Depuración, General, Habilitar el paso de fuente de .NET Framework

Captura de pantalla del menú de opciones

Siguiendo las instrucciones de la página de MSDN Cómo: Depurar .NET Framework Fuente :

Para habilitar la depuración de origen de .NET Framework

  1. En el menú Herramientas , haga clic en Opciones .

  2. En el cuadro de diálogo Opciones , haga clic en la categoría Depuración .

  3. En el cuadro General , seleccione las siguientes casillas de verificación:

    • Habilitar el paso de fuente de .NET Framework
    • Habilitar la compatibilidad con el servidor de origen

Hago esto:

Captura de pantalla del menú de opciones, destacando las opciones relevantes seleccionadas

Nota : Notará, como señala la página de MSDN, y como noté, que al marcar Habilitar paso de fuente de .NET Framework automáticamente se desmarcará ** Habilitar solo mi código (solo administrado). También habilité los mensajes de diagnóstico de soporte del servidor de origen.

Habilitar esas opciones configura automáticamente una ubicación de descarga de caché de símbolos para mí:

Captura de pantalla del menú de opciones, que muestra el directorio de caché (resaltado)

Nota : La entrada de Microsoft Symbol Server ya está presente (y no se puede eliminar).


La página de MSDN dice que cargue los símbolos:

Para cargar símbolos de Framework usando la ventana Módulos

  1. En la ventana Módulos , haga clic con el botón derecho en un módulo para el que no se cargan símbolos. Puede saber si los símbolos están cargados o no mirando la columna Estado de los símbolos .

  2. Seleccione Cargar símbolos desde y haga clic en Servidores de símbolos de Microsoft para descargar símbolos del servidor de símbolos públicos de Microsoft o Ruta de símbolos para cargarlos desde un directorio donde haya almacenado símbolos anteriormente.

Intento esto:

ingrese la descripción de la imagen aquí

y luego se cargan todos los símbolos:

Captura de pantalla de la ventana de módulos, como se describe arriba

He estado sentado en un punto de interrupción, que está a punto de llamar al código de .NET Framework:

Captura de pantalla del código, transcrito a continuación

protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
{
    base.ScaleControl(factor, specified);

Empujar F11hace que el depurador simplemente salte a la siguiente línea:

Captura de pantalla del código, transcrito a continuación

protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
{
    base.ScaleControl(factor, specified);

    //Record the running scale factor used
    this.scaleFactor = new SizeF(
            this.scaleFactor.Width * factor.Width,
            this.scaleFactor.Height * factor.Height);

¿Cómo habilito el paso de fuente de .NET Framework en Visual Studio 2010?


Estoy sentado en un punto de interrupción en mi código. Intento hacer doble clic en una función más arriba en la pila de llamadas. Espero que esto me permita saltar al código .NET:

ingrese la descripción de la imagen aquí

Excepto que no funciona: Visual Studio me dice que no hay una fuente disponible:

Captura de pantalla del mensaje de error que dice No hay fuente disponible

¿Cómo habilito el paso de fuente de .NET Framework en Visual Studio 2010?


Si cambio a la vista de desmontaje antes de intentar entrar en el código .NET ( Depurar -> Windows -> Desmontaje ), puedo ver un callcódigo .NET:

Captura de pantalla del código

Y cuando lo hago, termino depurando un desmontaje de System.Windows.Forms.ScaleControl:

Captura de pantalla de la ventana de desmontaje

Lo cual no es lo mismo ni tan útil como poder ingresar a la fuente de .NET Framework.

¿Cómo habilito el paso de fuente de .NET Framework en Visual Studio 2010?


La ruta de caché de símbolos configurada en mi computadora contiene archivos de caché de símbolos:

Captura de pantalla de la lista de carpetas

Entonces esta descargando pdb archivos de símbolos, pero se niega a usarlos.

¿Cómo habilito el paso de fuente de .NET Framework en Visual Studio 2010?


Leppie sugirió que revisara el Debugregistro (con la ventana del registro de depuración abierta; de lo contrario, no registra nada):

Step into: Stepping over method without symbols 'System.Windows.Forms.Form.ScaleControl'

Anteriormente en el registro, lo veo cargando símbolos para System.Windows.Forms.dll:

Loaded 'C:\Windows\assembly\GAC_MSIL\System.Windows.Forms\2.0.0.0__b77a5c561934e089\System.Windows.Forms.dll', Symbols loaded.

ingrese la descripción de la imagen aquí

Así que está buscando mis símbolos, pero afirmando que no pudo encontrarlos.

¿Cómo habilito el paso de fuente de .NET Framework en Visual Studio 2010?


Un tipo de Microsoft Italia sugiere desactivar Requerir que los archivos de origen coincidan exactamente con la versión original :

Captura de pantalla de la ventana de opciones

Eso no lo solucionó.

¿Cómo habilito el paso de fuente de .NET Framework en Visual Studio 2010?


Se ha sugerido que hay un error con el servidor de origen de Microsoft para .NET Framework 4.0 . Siguiendo esa sugerencia, cambié el proyecto a .NET Framework 3.5 de destino :

ingrese la descripción de la imagen aquí

Eso no lo solucionó.

¿Cómo habilito el paso de fuente de .NET Framework en Visual Studio 2010?


Alguien en algún lugar se preguntó distraídamente si otra persona que experimentaba el mismo problema estaba usando la versión de 64 bits del depurador . Ahora, no existe una versión de 64 bits de Visual Studio, pero intenté cambiar mi proyecto de AnyCPU a x86 (estaba siendo JITed a x64), en caso de que Microsoft no admita procesadores de 64 bits:

ingrese la descripción de la imagen aquí

Eso no lo solucionó:

Step into: Stepping over method without symbols 'System.Windows.Forms.Form.ScaleControl'

¿Cómo habilito el paso de fuente de .NET Framework en Visual Studio 2010?


Ver también

Ian Boyd
fuente
¿Ha comprobado el "caché" del código fuente?
leppie
@leppie ¿Qué quieres decir con "código fuente 'caché'"? Si te refieres a la carpeta que almacena en caché el código fuente, se está llenando (ver Actualización 4 )
Ian Boyd
Si. ¿Es posible abrir ese archivo fuente y establecer un punto de interrupción?
leppie
1
excelente redacción del problema!
andersonbd1
1
Tampoco funciona en VS2012. Funcionó durante un día, después de que configuré todo y dejé de funcionar. Dos días, docenas de cafés, cientos de páginas web después, simplemente no funciona. Al mismo tiempo, las fuentes publicadas por symbolsource.org funcionan como un encanto.
Wiktor Zychla

Respuestas:

35

Los PDB para recorrer el código fuente solo se publican para RTM y Service Packs. Como tal, cuando aparece una actualización de seguridad y modifica el dll que está intentando depurar, hará que el paso de la fuente no funcione (es decir, obtendrá el mensaje "No hay fuente disponible" con un "Examinar para encontrar la fuente" ").

Sin embargo, una vez que haya realizado todas las configuraciones adecuadas, puede utilizar la siguiente solución. La solución consiste esencialmente en encontrar las actualizaciones de seguridad que provocaron el cambio de la dll y luego eliminarlas. Esto tiene la desventaja obvia de eliminar esas actualizaciones de seguridad de su máquina.

Solución alterna

  1. Identifique en qué dll desea depurar (por ejemplo, System.Windows.Forms.dll)
  2. Mientras depura, abra el ventana Módulos en Visual Studio, busque la Versión columna . Si la versión no es la versión RTM o Service Pack, deberá realizar el flujo de trabajo. Normalmente, la dll de RTM dirá "construido por: RTMRel". Mientras que una dll que formaba parte de una actualización de seguridad dirá "construido por: RTMGDR". Anote el número de versión (por ejemplo 4.0.30319.269 creado por: RTMGDR)
  3. Ahora, queremos encontrar la actualización que creó esta versión. Haga esto buscando el dll y el número de versión en support.microsoft.com/kb/ Por ejemplo, hice la siguiente búsqueda en Google: site:support.microsoft.com/kb System.Windows.Forms.dll 4.0.30319.269
  4. La búsqueda debería mostrar información sobre una actualización. Anote el número de KB en la barra de direcciones. En mi ejemplo, la dirección era http://support.microsoft.com/kb/2604121KB2604121, es lo que nos interesa.
  5. Vaya a Panel de control-> Programas y características, y haga clic en "Ver actualizaciones instaladas"
  6. Busque una actualización que enumere el número de KB (puede utilizar la búsqueda en el cuadro superior derecho).
  7. Desinstale esa actualización.
  8. Repita este proceso para este mismo dll hasta que el dll vuelva a su versión RTMRel o SP. Por ejemplo, para System.Windows.Forms.dll, tuve que eliminar KB2686827, KB2604121, KB2518870 antes de que volviera a la versión RTMRel.

Deberá hacer esto para cada dll dentro del marco .NET en el que le interese depurar.

Una vez hecho esto, establezca un punto de interrupción dentro de la fuente .net (por ejemplo, vaya a la pestaña Breakpoints, diga New-> Break at Function, e ingrese System.Windows.Forms.Form.Form) o ingrese a uno de los .net métodos en ese dll.

Matt Smith
fuente
1
Bien, el truco está en localizar los correctos para desinstalar (ya que normalmente tienes muchos instalados y tardan un poco en desinstalarse).
Matt Smith
No puedo desinstalar las actualizaciones de seguridad. Va en contra de la política de la empresa. ¿Hay alguna forma de obtener copias de mscorlib.dll (y otros) que coincidan con el servidor de símbolos de Microsoft? Mi mscorlib.dll es la versión 4.0.30319.269 (RTMGDR.030319-2600). Posiblemente, podría actualizar temporalmente GAC con esta nueva DLL e intentar el paso de fuentes.
kevinarpe
Probablemente también vaya en contra de la política de mi empresa; simplemente los reinstalo cuando termino. No creo que se pueda colocar en una versión anterior mscorlib.dll independientemente de las otras DLL que deberían revertirse con él (para que funcione correctamente). Además, la actualización temporal del GAC con archivos DLL antiguos sería esencialmente equivalente a desinstalar temporalmente la actualización de seguridad.
Matt Smith
La razón probable por la que Microsoft no publica la fuente de actualizaciones de seguridad es que alguien podría comparar los cambios de código, comprender cuál era la vulnerabilidad de seguridad y crear sus propios exploits. Lo que Microsoft no se da cuenta es que el "código fuente" ya está disponible usando ILSpy o Relfector. Por lo tanto, Microsoft, al no publicar el código fuente, no está haciendo que nadie sea más seguro, es solo que la vida de los desarrolladores es más difícil.
Ian Boyd
2
@IanBoyd Dudo que esa sea la motivación de la EM. Asumiría que su flujo de trabajo simplemente no admite la actualización de los PDB de origen para la depuración. Su principal preocupación es cerrar los agujeros de seguridad.
xanadont
6

Aunque desafortunadamente hay un problema con Microsoft, como señaló Leppie (y obtuve el mismo resultado, vea

Cabe señalar que su intento fallará de todos modos, ya que hizo referencia a:

  • Microsoft Symbol Server

en vez de:

  • referencesource.microsoft.com/symbols

Consulte la sección de Preguntas frecuentes / Solución de problemas de Configuración de Visual Studio para depurar el código fuente de .NET Framework

yoel halb
fuente
4

Creo que he encontrado la respuesta.

Seguí lo que estaba sucediendo en Fiddler. Parece que solo los símbolos están disponibles actualmente y no hay fuente.

Cuando VS intenta cargar los símbolos del servidor de 'fuente de referencia', falla (404). Como esto falla, creo que no se puede asignar a los archivos de origen en ese servidor.

http://referencesource.microsoft.com/symbols/mscorlib.pdb/ED96A7F38A2940F39B9CA7AD9BC5CB671/mscorlib.pdb

Después de la falla anterior, intenta un servidor llamado 'msdl' donde encuentra el PDB real (pero parece que este no tiene información de código fuente).

http://msdl.microsoft.com/download/symbols/mscorlib.pdb/ED96A7F38A2940F39B9CA7AD9BC5CB671/mscorlib.pd_

Con todo, parece ser un problema (temporal) de Microsoft con sus servidores.

Estoy seguro de que tuve algo de código fuente hace un tiempo. Pero ahora no funciona.

Editar:

Lo probé con varias versiones de .NET, todos con el mismo resultado. :(

leppie
fuente
1
Bueno, eso sería muy interesante si mis pasos exactos deben trabajar (pero no), será trabajar (en el futuro), y hacer el trabajo (pero no en la actualidad). También sería extraordinariamente frustrante, ya que pasé 11 horas en el problema.
Ian Boyd
2
msdl.microsoft.com parece ser Microsoft Symbol Server
yoel halb
2
y está roto de nuevo
Simon_Weaver
No parece ser un "problema temporal del servidor", 7 años después y los enlaces siguen muertos.
jrh
1

En mi caso, estaba depurando una antigua aplicación .NET 2.0 WinForms y recibí el mensaje "Fuente no disponible" . Probé todas las configuraciones recomendadas.

En última instancia, reconstruí la aplicación para apuntar temporalmente a .NET 4.5 y pude hacer que la fuente funcionara. Quizás mi aplicación era demasiado antigua para cambiar la fuente. Un poco frustra el propósito, lo sé, pero para pruebas rápidas y sucias funciona. El error que tengo todavía está presente en .NET 4.5 . :)

Marco de destino

Brian Chávez
fuente
0

Aquí están las instrucciones oficiales https://referencesource.microsoft.com/setup.html

Configurar Visual Studio 2013 para depurar .NET framework

Para configurar Visual Studio 2013, haga lo siguiente en el menú Herramientas -> Opciones -> Depuración -> General:

  • Deshabilitar solo mi código
  • Deshabilitar propiedades y operadores de paso a paso
  • Desactivar requerir que los archivos de origen coincidan exactamente con la versión original
  • Habilitar el paso de fuente de .NET Framework
  • Habilitar la compatibilidad con el servidor de origen
Coronel Panic
fuente