Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Si está intentando depurar código, es más fácil cuando ese código no está optimizado. Cuando se optimiza el código, el compilador y el tiempo de ejecución realizan cambios en el código de CPU emitido para que se ejecute más rápido, pero tiene una asignación menos directa al código fuente original. Si la asignación es menos directa, los depuradores con frecuencia no pueden indicarle el valor de las variables locales, y es posible que los puntos de interrupción y paso a paso del código no funcionen según lo previsto.
Nota:
Para obtener más información sobre la depuración JIT (Just-In-Time), lea esta documentación.
Funcionamiento de las optimizaciones en .NET
Normalmente, la configuración de compilación de publicación crea código optimizado y la configuración de compilación de depuración no. La Optimize
propiedad MSBuild controla si se indica al compilador que optimice el código.
En el ecosistema de .NET, el código se convierte de origen a instrucciones de CPU en un proceso de dos pasos: en primer lugar, el compilador de C# convierte el texto que escribe en un formulario binario intermedio denominado MSIL y escribe el MSIL en .dll archivos. Más adelante, el entorno de ejecución de .NET convierte este MSIL en instrucciones de CPU. Ambos pasos pueden optimizar hasta cierto punto, pero el segundo paso realizado por el entorno de ejecución de .NET realiza las optimizaciones más significativas.
La opción "Suprimir la optimización JIT al cargar el módulo (solo administrada)"
El depurador expone una opción que controla lo que sucede cuando un archivo DLL compilado con optimizaciones habilitadas se carga dentro del proceso de destino. Si esta opción está desactivada (el estado predeterminado), cuando .NET Runtime compila el código MSIL en código de CPU, deja habilitadas las optimizaciones. Si la opción está activada, el depurador solicita que se deshabilite la optimización.
Para buscar la opción Suprimir optimización JIT en la carga del módulo (solo administrado), seleccione Opciones de herramientas> y, a continuación, seleccione la página General en el nodo Depuración.
¿Cuándo debe comprobar la opción "Suprimir optimización JIT"?
Seleccione esta opción cuando haya descargado los archivos DLL de otro origen, como un paquete NuGet, y si desea depurar el código en estos archivos DLL. Para que la supresión funcione, también debe encontrar el archivo de símbolos (.pdb) para este archivo DLL.
Si solo está interesado en depurar el código que está compilando localmente, es mejor dejar esta opción desactivada, ya que, en algunos casos, habilitar esta opción ralentizará significativamente la depuración. Hay dos razones para esta ralentización:
- El código optimizado se ejecuta más rápido. Si va a desactivar las optimizaciones para una gran cantidad de código, el impacto en el rendimiento puede acumularse.
- Si tiene habilitado Solo mi código, el depurador ni siquiera intentará cargar símbolos para archivos DLL optimizados. La búsqueda de símbolos puede tardar mucho tiempo.
Limitaciones de la opción "Suprimir optimización JIT"
Hay dos situaciones en las que activar esta opción NO funcionará:
En situaciones en las que está adjuntando el depurador a un proceso ya en ejecución, esta opción no tendrá ningún efecto en los módulos que ya se cargaron en el momento en que se adjuntó el depurador.
Esta opción no tiene ningún efecto en las DLL que han sido precompiladas (o ngenizadas) a código nativo. Sin embargo, puede deshabilitar el uso del código precompilado iniciando el proceso con la variable de entorno "COMPlus_ReadyToRun" establecida en "0". Esto indicará al entorno de ejecución de .NET Core que deshabilite el uso de imágenes precompiladas, forzando que el entorno de ejecución compile JIT el código del framework.
Si tiene como destino .NET Framework, agregue la variable de entorno "COMPlus_ZapDisable" y establézcala en "1".
Añádalo "COMPlus_ReadyToRun": "0"
a cada perfil del archivo de Propiedades\launchSettings.jssobre:
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:59694/",
"sslPort": 44320
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"COMPlus_ReadyToRun": "0"
}
},
"HttpLoggingSample": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"COMPlus_ReadyToRun": "0"
},
"applicationUrl": "https://localhost:5001;http://localhost:5000"
}
}
}