Modifications de code prises en charge (C++)

Modifier et Continuer pour les projets C++ gère la plupart des types de modifications du code. Toutefois, certaines modifications ne peuvent pas être appliquées pendant l'exécution du programme. Pour appliquer ces modifications, vous devez arrêter l'exécution et générer une nouvelle version du code.

Pour plus d’informations sur l’utilisation de Modifier & Continuer pour C++ dans Visual Studio, consultez Edit and Continue (C++).

Configuration requise

Paramètres de build (Projet > Propriétés) :

  1. C/C++ > Général > Format des informations de débogage : Programmer la base de données pour Modifier et Continuer (/ZI)

  2. Éditeur de liens > Général > Activer la liaison incrémentielle : Oui (/INCREMENTAL)

    Tous les paramètres d’éditeur de liens incompatibles (comme /SAFESEH ou /OPT:...) doivent provoquer un avertissement LNK4075 pendant la génération.
    Exemple : LINK : warning LNK4075: ignoring '/INCREMENTAL' due to '/OPT:ICF' specification

Paramètres du débogueur (Débogage > Options > Général) :

  • Activer Modifier et Continuer natif

    Tous les paramètres incompatibles du compilateur ou de l’éditeur de liens provoquent une erreur lors de Modifier et Continuer.
    Exemple : Edit and Continue : error : ‘file.cpp’ in ‘MyApp.exe’ was not compiled with Edit and Continue enabled. Ensure that the file is compiled with the Program Database for Edit and Continue (/ZI) option.

Modifications non prises en charge

Les modifications C/C++ suivantes ne peuvent pas être appliquées pendant une session de débogage. Si vous procédez à l’une de ces modifications puis essayez de l’appliquer, un message d’erreur ou d’avertissement apparaît dans la fenêtre Sortie.

  • La plupart des modifications apportées aux données globales ou statiques.

  • Modifications apportées à des exécutables copiés depuis un autre ordinateur et non générés localement.

  • Modifications apportées à un type de données qui affectent la disposition d'un objet, comme les données membres d'une classe.

  • Ajout de plus de 64 Ko de nouveau code ou de nouvelles données.

  • Ajout de variables qui nécessitent un constructeur à un point situé avant le pointeur d'instruction.

  • Modifications qui affectent le code qui nécessite une initialisation d'exécution.

  • Ajout de gestionnaires d'exceptions, dans certains cas.

  • Modifications apportées aux fichiers de ressources.

  • Modifications apportées au code de fichiers en lecture seule.

  • Modifications apportées au code sans fichier PDB correspondant.

  • Modifications apportées au code sans fichier objet.

  • Modification des lambdas qui :
    • Ont un membre statique ou global.
    • Sont passés à une std::function. Cela provoque une véritable violation ODR et entraîne l’erreur C1092.
  • Modifier & Continuer ne met pas à jour les bibliothèques statiques. Si vous apportez une modification dans une bibliothèque statique, l'exécution continue avec l'ancienne version et aucun avertissement n'est émis.

Scénarios non pris en charge

Modifier & Continuer pour C/C++ n'est pas disponible dans les scénarios de débogage suivants :

  • Débogage des applications natives compilées avec /zo (Améliorer le débogage optimisé)

  • Projets qui utilisent l’ensemble d’outils VC 120 et le commutateur C/C++ /bigobj. Modifier et Continuer avec /bigobj est uniquement pris en charge dans l’ensemble d’outils VC 140.

  • Débogage en mode mixte (natif/managé).

  • Débogage JavaScript.

  • Débogage SQL.

  • Débogage d'un fichier dump.

  • Modification de code après une exception non gérée, lorsque l'option Dérouler la pile des appels sur les exceptions non gérées n'est pas sélectionnée.

  • Débogage d'une application à l'aide de la commande Attacher à au lieu d'exécuter l'application en choisissant Démarrer dans le menu Déboguer .

  • Débogage de code optimisé.

  • Débogage d'une version ancienne de votre code après l'échec de génération d'une nouvelle version en raison d'erreurs de build.

  • Utilisation d’un chemin d’accès de compilateur personnalisé (cl.exe). Pour des raisons de sécurité, pour la recompilation d’un fichier lors de l’édition et de la poursuite, Visual Studio utilise toujours le compilateur installé. Si vous utilisez un chemin d’accès de compilateur personnalisé (par exemple, via une variable $(ExecutablePath) personnalisée dans votre fichier *.props), un avertissement s’affiche et Visual Studio repasse à l’utilisation du compilateur installé de la même version/architecture.

  • Architectures/ensembles d’outils VC hérités. Avec l’ensemble d’outils VC 140, le débogueur par défaut prend en charge l’option Modifier et Continuer avec les applications X86 et X64. Les ensembles d’outils hérités prennent uniquement en charge les applications X86. Les ensembles d’outils antérieurs à VC 120 doivent utiliser le débogueur hérité en cochant « Débogage > Options > Général > Utiliser le mode de compatibilité natif » pour utiliser Modifier et Continuer.

Limitations des liens

Options de l'Éditeur de liens désactivant Modifier & Continuer

Les options suivantes de l'Éditeur de liens désactivent Modifier & Continuer :

  • Définir /OPT:REF, /OPT:ICFou /INCREMENTAL:NO désactive Modifier & Continuer avec l'avertissement suivant :
    LINK : warning LNK4075: ignoring /EDITANDCONTINUE due to /OPT specification

  • Définir /ORDER, /RELEASEou /FORCE désactive Modifier & Continuer avec l’avertissement suivant :
    LINK : warning LNK4075: ignoring /INCREMENTAL due to /option specification

  • Définir toute option empêchant la création d'un fichier de base de données de programme (.pdb) désactive Modifier & Continuer sans avertissement spécifique.

Limitations de la réédition automatique de liens

Par défaut, Modifier & Continuer recrée les liens de votre programme à la fin d'une session de débogage pour créer un exécutable à jour.

Modifier & Continuer ne peut pas rétablir les liens de votre programme si vous effectuez le débogage à un endroit différent de la génération d'origine. Un message vous invite à effectuer une régénération manuelle.

Modifier & Continuer ne régénère pas les bibliothèques statiques. Si vous apportez des modifications à une bibliothèque statique avec Modifier & Continuer, vous devrez manuellement régénérer la bibliothèque et rétablir les liens des applications qui l'utilisent.

Modifier & Continuer n'appelle pas d'étapes de build personnalisée. Si votre programme utilise des étapes de build personnalisée, vous pouvez réaliser des régénérations manuelles afin que les étapes de build personnalisée puissent être appelées. Dans ce cas, vous pouvez désactiver la création d'un nouveau lien après Modifier & Continuer afin d'être certain d'être invité à régénérer manuellement.

Pour désactiver la ré-édition des liens après exécution de Modifier & Continuer

  1. Dans le menu Déboguer , choisissez Options et paramètres.

  2. Dans la boîte de dialogue Options , sous le nœud Débogage , sélectionnez le nœud Modifier & Continuer .

  3. Désactivez la case à cocher Reconstruire le code modifié après le débogage .

Limitations des en-têtes précompilés

Par défaut, Modifier & Continuer charge et traite les en-têtes précompilés en arrière-plan pour accélérer le traitement des modifications du code. Le chargement d'en-têtes précompilés exige l'allocation de mémoire physique, ce qui peut poser un problème si vous exécutez la compilation sur un ordinateur pauvre en mémoire vive. Pour savoir si vous vous trouvez dans cette situation, vous pouvez utiliser le Gestionnaire des tâches de Windows afin d'évaluer la quantité de mémoire physique disponible pendant que vous déboguez. Si cette quantité est supérieure à la taille des en-têtes précompilés, l'opération Modifier & Continuer devrait se dérouler sans problème. Si elle est inférieure à la taille des en-têtes précompilés, vous pouvez empêcher l'opération Modifier & Continuer de charger ces en-têtes en arrière-plan.

Pour désactiver le chargement en arrière-plan d'en-têtes précompilés par Modifier & Continuer

  1. Dans le menu Déboguer , choisissez Options et paramètres.

  2. Dans la boîte de dialogue Options , sous le nœud Débogage , sélectionnez le nœud Modifier & Continuer .

  3. Désactivez la case à cocher Autoriser la précompilation .

Limitations des attributs IDL

La fonction Modifier & Continuer ne régénère pas de fichiers Interface Definition Language (IDL). Par conséquent, les modifications des attributs IDL ne seront pas reflétées pendant le débogage. Pour voir le résultat des modifications apportées aux attributs IDL, vous devez arrêter le débogage et régénérer votre application. Modifier & Continuer ne génère pas d'erreur ou d'avertissement lorsque des attributs IDL ont été modifiés. Pour plus d'informations, consultez Attributs IDL.

Problèmes de diagnostic

Si votre scénario ne correspond à aucune des conditions mentionnées ci-dessus, vous pouvez obtenir des détails supplémentaires en définissant la valeur de Registre DWORD suivante :

  1. Ouvrez une invite de commandes développeur.
  2. Exécutez la commande suivante :
    VsRegEdit.exe set “C:\Program Files\Microsoft Visual Studio\[Version]\[YOUR EDITION]” HKCU Debugger NativeEncDiagnosticLoggingLevel DWORD 1
    VsRegEdit.exe set “C:\Program Files (x86)\Microsoft Visual Studio\[Version]\[YOUR EDITION]” HKCU Debugger NativeEncDiagnosticLoggingLevel DWORD 1

La définition de cette valeur au début d’une session de débogage entraîne le fait que les différents composants de Modifier et Continuer génère des journaux volumineux dans le volet Fenêtre Sortie>Débogage.