visual ventana variable valor una studio puede mostrar locales inspeccion encuentra editar continuar como archivo abrir c# visual-studio debugging compiler-construction

c# - ventana - Visual Studio Debugger: ¿alguna forma de acceder a las variables temporales generadas por el compilador a través del depurador?



ventana de inspeccion visual basic (2)

Si examina el código C # en Reflector, puede observar variables locales especiales generadas por el compilador que se nombran con el patrón CS $ X $ Y. Estas variables fueron (extraoficialmente) documentadas en esta respuesta .

¿Hay alguna forma de ver estos valores a través de la ventana Inspección en Visual Studio o mediante la API de Extensibilidad del depurador VS?

Pregunto específicamente sobre el depurador regular de Visual Studio, por favor no responda que esto es posible a través de windbg / sos / sosex, ya que eso no es lo que estoy buscando.


Desafortunadamente no hay forma de hacer esto con el C # EE. Los nombres de estos lugareños están almacenados en el PDB y están disponibles. Sin embargo, el C # EE filtrará todos los valores temporales durante la depuración para reducir el desorden. Este filtrado es incondicional y no puede ser anulado. C # no está solo aquí ya que este es el comportamiento en todos los idiomas.

Sin embargo, la buena noticia es que cada idioma usa diferentes patrones de nombres para sus temporarios. Esto significa que un nombre temporal en C # se ejecutará justo después del filtrado del VB EE. Aunque es un identificador ilegal, VB EE todavía lo considera un local válido (y viceversa). Por lo tanto, solo necesita cambiar temporalmente el motor de depuración para el código C # al VB EE y los locales se volverán visibles

Aquí está cómo hacer esto

  • Cierre todas las instancias de Visual Studio (esto es realmente importante)
  • Abre regedit
  • Navegue a HKEY_CURRENT_USER/Software/Microsoft/VisualStudio/12.0_Config/AD7Metrics/ExpressionEvaluator/{3F5162F8-07C6-11D3-9053-00C04FA302A1}/{994B45C4-E6E9-11D2-903F-00C04FA302A1}
  • Cambie el valor de CLSID de {60F5556F-7EBC-4992-8E83-E9B49187FDE3} a {59924502-559A-4BB1-B995-5D511BB218CD}

Ahora, cada vez que depure el código C #, usará el VB EE y, por lo tanto, mostrará los temporales como locales normales. Tenga en cuenta que esto no está soportado por completo. Pero debería funcionar bien. Pude ver los valores de cierre sin procesar con este truco en mi máquina y hurgar un poco sin ningún problema.

Tenga en cuenta que estas instrucciones son específicas de Visual Studio 2013. Si está utilizando 2012 o 2010 debería funcionar cambiando la configuración de 12.0_Config en el nombre de la clave de registro.

  • 2012 uso 11.0_Config
  • 2010 uso 10.0_Config

Es posible que necesite algunos ajustes además de eso (en realidad no se probaron versiones anteriores). Si surge algún problema, avíseme y lo intentaré para que funcione localmente y actualice las instrucciones

Aquí hay una foto del resultado final una vez que hagas este cambio


No, no se agregan al archivo PDB. El depurador simplemente no tiene forma de descubrirlos, ni sabe nada sobre dónde están almacenados. Esto es completamente intencional.