次の方法で共有


サポートされているコード変更 (C++)

C++ プロジェクトのエディット コンティニュは、ほとんどの種類のコード変更を処理します。 ただし、一部の変更はプログラムの実行中に適用できません。 これらの変更を適用するには、実行を停止し、新しいバージョンのコードをビルドする必要があります。

Visual Studio での C++ の エディット コンティニュの操作については、「エディット コンティニュ (C++)」 を参照してください。

Requirements

ビルド設定 (Project > プロパティ)

  • C/C++ > 一般的な > デバッグ情報形式: 編集および継続用プログラムデータベース (/ZI)

  • リンカー > 一般的な > インクリメンタル リンクを有効にする: はい (/INCREMENTAL)

    互換性のないリンカー設定 ( /SAFESEH/OPT:など)、ビルド中に警告 LNK4075 が発生する可能性があります。 例: LINK : warning LNK4075: ignoring '/INCREMENTAL' due to '/OPT:ICF' specification

デバッガーの設定 (デバッグ > オプション)

デバッグ (またはツール) >Options ペインを開き、[すべての設定]>[Debugging>.NET/C++ ホット リロード] セクションを展開します。

デバッグ (またはツール) >Options ダイアログを開き、[デバッグ>.NET/C++ ホット リロード] セクションを展開します。

この機能を有効にするには、次のオプションのいずれかを選択します。

  • ホット リロードを有効にする: デバッガーをアタッチして起動するときにホット リロードを有効にします (F5)。

  • デバッグなしで起動するときにホット リロードを有効にする: デバッガーをアタッチ せずに 起動するときにホット リロードを有効にします (Ctrl + F5)。

  • [ファイルの保存時にホット リロードを有効にする]: ファイルの保存時にホット リロードを有効にします。

  • ログの詳細度: ホット リロードが有効になっている場合のログ記録のレベルを設定します。 最小(デフォルト)詳細診断を選択してください。

これらの設定を変更すると、作業中のすべてのプロジェクトに影響します。 設定を変更した後、アプリケーションをリビルドする必要はありません。 コマンド ラインまたはメイクファイルからアプリケーションをビルドしても、Visual Studio 環境でデバッグする場合は、 /ZI オプションを設定した場合でもエディット コンティニュを使用できます。

デバッグ (またはツール) >Options] ダイアログ ボックスで、[デバッグ>General] セクションを展開し、[ネイティブ編集と続行を有効にする] チェック ボックスをオンにします。

互換性のないコンパイラまたはリンカーの設定では、エディット コンティニュ中にエラーが発生します。
例: 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.

サポートされていない変更

次の C/C++ の変更は、デバッグ セッション中に適用できません。 これらの変更のいずれかを行い、コードの変更を適用しようとすると、エラーまたは警告メッセージが 出力 ウィンドウに表示されます。

  • グローバル データまたは静的データに対するほとんどの変更。

  • 別のコンピューターからコピーされ、ローカルにビルドされていない実行可能ファイルに対する変更。

  • クラスのデータ メンバーなど、オブジェクトのレイアウトに影響するデータ型に対する変更。

  • 64,000 バイトを超える新しいコードまたはデータを追加する。

  • 命令ポインターの前のポイントにコンストラクターを必要とする変数を追加する。

  • 実行時の初期化を必要とするコードに影響する変更。

  • 一部のインスタンスでの例外ハンドラーの追加。

  • リソース ファイルに対する変更。

  • 読み取り専用ファイル内のコードに対する変更。

  • 対応する PDB ファイルのないコードに対する変更。

  • オブジェクト ファイルがないコードに対する変更。

  • 次のシナリオでのラムダの変更:

    • ラムダに静的メンバーまたはグローバル メンバーがある場合。
    • ラムダを std::functionに渡す場合。 このメソッドは本物の ODR 違反を引き起こし、C1092 になります。
  • エディット アンド コンティニューでは、静的ライブラリは更新されません。 スタティック ライブラリで変更を加えた場合、実行は古いバージョンで続行され、警告は発行されません。

サポートされていないシナリオ

次のデバッグ シナリオでは、C/C++ のエディット アンド コンティニューの機能は使用できません。

  • /Zo でコンパイルされたネイティブ アプリの デバッグ (最適化されたデバッグの強化)

  • MSVC v120 ツールセットと C/C++ /bigobj スイッチを使用するプロジェクト。 編集と続行 /bigobj は、MSVC v140 以降のビルド ツールでのみサポートされています。

  • 混合モード (ネイティブ/マネージド) デバッグ。

  • JavaScript デバッグ。

  • SQL デバッグ。

  • ダンプ ファイルのデバッグ。

  • ハンドルされない例外が発生した後に、ハンドルされない例外でコールスタックを巻き戻す オプションが選択されていない場合は、コードを編集します。

  • [デバッグ] メニューの [スタート] を選択してアプリを実行する代わりに、[アタッチ] を使用してアプリをデバッグします。

  • 最適化されたコードのデバッグ。

  • ビルド エラーのために新しいバージョンのビルドに失敗した後、古いバージョンのコードをデバッグする。

  • カスタム コンパイラ (cl.exe) パスの使用。 セキュリティ上の理由から、エディット コンティニュ中にファイルを再コンパイルする場合、Visual Studio では常にインストールされているコンパイラが使用されます。 カスタム コンパイラ パスを使用している場合 (たとえば、$(ExecutablePath) ファイル内のカスタム *.props変数を使用する場合)、警告が表示され、Visual Studio はインストールされている同じバージョン/アーキテクチャのコンパイラの使用にフォールバックします。

  • 従来のアーキテクチャ/MSVC ツールセット。 MSVC v140 ツールセットを使用することで、既定のデバッガーは X86 アプリケーションと X64 アプリケーションの両方において、エディット アンド コンティニューをサポートします。 レガシ ツールセットでは、X86 アプリケーションのみがサポートされます。 MSVC v120 より前のツールセットを使用する場合、エディットと続行機能を利用するには、レガシ デバッガーを使う必要があります。そのためには、[デバッグ > オプション] > [全般] > の [ネイティブ互換モードを使用する] をチェックしてください。

リンクの制限事項

エディット アンド コンティニューを無効にするリンカーオプション

次のリンカー オプションは、エディット アンド コンティニュー機能を無効にします。

  • /OPT:REF/OPT:ICF、または /INCREMENTAL:NO を設定すると、エディット コンティニュが無効になり、次の警告が表示されます。
    LINK : warning LNK4075: ignoring /EDITANDCONTINUE due to /OPT specification

  • /ORDER/RELEASE、または /FORCE を設定すると、エディット アンド コンティニューが無効になり、次の警告が表示されます。
    LINK : warning LNK4075: ignoring /INCREMENTAL due to /option specification

  • プログラム データベース (.pdb) ファイルの作成を妨げるオプションを設定すると、特定の警告なしでエディット コンティニュが無効になります。

自動再リンクの制限事項

既定では、エディット コンティニュはデバッグ セッションの最後にプログラムを再リンクし、up-to-date 実行可能ファイルを作成します。

元のビルドの場所以外の場所からデバッグしている場合、エディット コンティニュでプログラムを再リンクすることはできません。 手動でリビルドする必要があることを示すメッセージが表示されます。

エディット コンティニュでは、スタティック ライブラリはリビルドされません。 エディット コンティニュを使用してスタティック ライブラリを変更する場合は、ライブラリを手動でリビルドし、それを使用してアプリを再リンクする必要があります。

編集と継続では、カスタム ビルド ステップが呼び出されることはありません。 プログラムでカスタム ビルド ステップを使用している場合は、カスタム ビルド ステップを呼び出すことができるように手動でリビルドすることができます。 その場合は、「Edit and Continue」後にリリンキングを無効にすることで、手動でのリビルドを必ず指示されるようになります。

「Edit and Continue」機能の後で再リンクを無効にするには:

  1. [ デバッグ ] メニューの [オプションと設定] を選択します。

  2. [ オプション ] ダイアログ ボックスの [ デバッグ ] ノードで、[ エディット コンティニュ ] ノードを選択します。

  3. [ デバッグ後にコードの変更を再リンクする ] チェック ボックスをオフにします。

プリコンパイル済みヘッダーの制限事項

既定では、エディット コンティニュはプリコンパイル済みヘッダーをバックグラウンドで読み込んで処理し、コード変更の処理を高速化します。 プリコンパイル済みヘッダーを読み込むには物理メモリの割り当てが必要です。これは、RAM が制限されたマシンでコンパイルする場合に問題になる可能性があります。 Windows タスク マネージャーを使用して、デバッグ中に使用可能な物理メモリの量を確認することで、これが問題になる可能性があるかどうかを判断できます。 この量がプリコンパイル済みヘッダーのサイズより大きい場合は、エディット コンティニュに問題はありません。 サイズがプリコンパイル済みヘッダーのサイズより小さい場合は、エディット コンティニュがプリコンパイル済みヘッダーをバックグラウンドで読み込むのを防ぐことができます。

エディット アンド コンティニュのプリコンパイル ヘッダーのバックグラウンド読み込みを無効にするには:

  1. [ デバッグ ] メニューの [オプションと設定] を選択します。

  2. [ オプション ] ダイアログ ボックスの [ デバッグ ] ノードで、[ エディット コンティニュ ] ノードを選択します。

  3. [ プリコンパイルを許可する ] チェック ボックスをオフにします。

IDL 属性の制限事項

エディット アンド コンティニューでは、インターフェイス定義言語 (IDL) ファイルは再生成されません。 そのため、デバッグ中は IDL 属性への変更は反映されません。 IDL 属性に対する変更の結果を表示するには、デバッグを停止してアプリをリビルドする必要があります。 エディット コンティニュでは、IDL 属性が変更されても、エラーや警告は発生しません。 詳細については、「 IDL 属性」を参照してください。

問題の診断

シナリオが上記のどの条件にも適合しない場合は、次の DWORD レジストリ値を設定して詳細を収集できます。

  1. 開発者コマンド プロンプトを開きます。

  2. 次のコマンドを実行します。

    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

デバッグ セッションの開始時にこの値を設定すると、Edit and Continue の各コンポーネントが冗長なログを出力ウィンドウ>デバッグペインに出力します。