Optimisation JIT et débogage
Si vous essayez de déboguer du code, cela est plus facile lorsque ce code n’est PAS optimisé. Lorsque le code est optimisé, le compilateur et le runtime modifient le code du processeur émis afin qu’il s’exécute plus rapidement, mais avec un mappage moins direct au code source d’origine. Si le mappage est moins direct, les débogueurs sont souvent incapables de vous indiquer la valeur des variables locales, et les pas de code et points d’arrêt peuvent ne pas fonctionner comme prévu.
Notes
Pour plus d’informations sur le débogage JIT (juste-à-temps), consultez cette documentation.
Fonctionnement des optimisations dans .NET
Normalement, la configuration de build de production crée du code optimisé, et la configuration de build de débogage ne le fait pas. La propriété MSBuild Optimize
contrôle si le compilateur est appelé à optimiser le code.
Dans l’écosystème .NET, le code est converti de la source en instructions processeur dans un processus en deux étapes : tout d’abord, le compilateur C# convertit le texte que vous tapez en un format binaire intermédiaire appelé MSIL, puis il écrit le MSIL dans des fichiers .dll. Après cela, le runtime .NET convertit ce MSIL en instructions processeur. Les deux étapes peuvent être optimisées dans une certaine mesure, mais la deuxième, effectuée par le runtime .NET, offre les optimisations les plus significatives.
L’option « Supprimer l’optimisation JIT lors du chargement du module (managé uniquement) »
Le débogueur expose une option qui contrôle ce qui se passe lorsqu’une DLL compilée avec les optimisations activées se charge à l’intérieur du processus cible. Si cette option est décochée (état par défaut), lorsque le runtime .NET compile le code MSIL dans le code du processeur, il laisse les optimisations activées. Si l’option est activée, le débogueur demande que les optimisations soient désactivées.
Pour rechercher l’option Supprimer l’optimisation JIT lors du chargement de module (managé uniquement), sélectionnez Outils>Options, puis la page Général sous le nœud Débogage.
Quand devez-vous cocher l’option « Supprimer l’optimisation JIT » ?
Activez cette option lorsque vous avez téléchargé les DLL à partir d’une autre source, comme un package NuGet, et que vous souhaitez déboguer le code dans cette DLL. Pour que la suppression fonctionne, vous devez également trouver le fichier de symbole (.pdb) pour cette DLL.
Si vous souhaitez uniquement déboguer le code que vous générez localement, il est préférable de laisser cette option décochée, car, dans certains cas, l’activation de cette option ralentit considérablement le débogage. Il existe deux raisons à ce ralentissement :
- Le code optimisé s’exécute plus rapidement. Si vous désactivez les optimisations pour une grande quantité de code, l’impact sur les performances peut s’accumuler.
- Si vous avez activé Uniquement mon code, le débogueur n’essaiera même pas de charger des symboles pour les DLL optimisées. La recherche de symboles peut prendre beaucoup de temps.
Limitations de l’option « Supprimer l’optimisation JIT »
Il existe deux situations dans lesquelles l’activation de cette option ne fonctionnera PAS :
Dans les situations où vous attachez le débogueur à un processus déjà en cours d’exécution, cette option n’aura aucun effet sur les modules qui ont déjà été chargés au moment où le débogueur a été attaché.
Cette option n’a aucun effet sur les DLL qui ont été précompilées (avec NGen) en code natif. Toutefois, vous pouvez désactiver l’utilisation du code précompilé en démarrant le processus avec la variable d’environnement 'COMPlus_ReadyToRun' définie sur '0'. Cela indique au runtime .NET Core de désactiver l’utilisation d’images précompilées, ce qui force le runtime à utiliser le code d’infrastructure de compilation JIT.
Si vous ciblez .NET Framework, ajoutez la variable d’environnement 'COMPlus_ZapDisable' et définissez-la sur '1'.
Définissez "COMPlus_ReadyToRun": "0"
en l’ajoutant à chaque profil dans le fichier Properties\launchSettings.json :
{
"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"
}
}
}