サポートされているコード変更 (C++)
C++ プロジェクトのエディット コンティニュは、大半の種類のコード変更に対応します。 ただし、一部の変更はプログラムの実行中に適用できません。 これらの変更を適用するには、プログラムの実行を中断し、新しいバージョンのコードをビルドする必要があります。
Visual Studio での C++ のエディット コンティニュを使用する作業の情報については、「エディット コンティニュ (C++)」を参照してください。
要件
ビルドの設定 ([プロジェクト] > [プロパティ]):
[C/C++] > [全般] > [デバッグ情報の形式]: [エディット コンティニュのプログラム データベース] (
/ZI
)[リンカー] > [全般] > [インクリメンタル リンクを有効にする]: [はい] (
/INCREMENTAL
)互換性のないリンカー設定 (
/SAFESEH
、/OPT:
など) を使用すると、ビルド中に警告 LNK4075 が発生します。
例:LINK : warning LNK4075: ignoring '/INCREMENTAL' due to '/OPT:ICF' specification
デバッガーの設定 ([デバッグ] > [オプション] > [全般]):
[ネイティブのエディット コンティニュを有効にする]
コンパイラまたはリンカーの互換性のない設定では、エディット コンティニュ中にエラーが発生します。
例: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 KB を超える新しいコードまたはデータの追加
命令ポインターの前にコンストラクターを必要とする変数の追加
ランタイム初期化を必要とするコードに影響を与える変更
一部のインスタンスでの例外ハンドラーの追加
リソース ファイルに対する変更
読み取り専用ファイル内のコードに対する変更
対応する PDB ファイルを持たないコードに対する変更
オブジェクト ファイルのないコードに対する変更
- 次のようなラムダの変更:
- 静的メンバーまたはグローバル メンバーがある。
- std::function に渡される。 これにより、正規の ODR 違反が発生し、C1092 が生成されます。
- エディット コンティニュでは、スタティック ライブラリは更新されません。 スタティック ライブラリに変更を加えた場合、変更前のスタティック ライブラリで実行が継続され、警告は表示されません。
サポートされていないシナリオ
次のデバッグ シナリオでは、C/C++ のエディット コンティニュを使用できません。
(強化に最適化されたデータのデバッグ)/Zoでコンパイルしたネイティブ アプリのデバッグ
VC 120 ツールセットと C/C++
/bigobj
スイッチが使用されるプロジェクト。/bigobj
でのエディット コンティニュは、VC 140 ツールセットでのみサポートされます。混合モードでの (ネイティブ/マネージ) デバッグ
JavaScript のデバッグ。
SQL デバッグ
ダンプ ファイルのデバッグ。
未処理の例外を受け取った後のコード編集 ( [ハンドルされていない例外で呼び出し履歴をアンワインドする] オプションがオンでない場合)
[デバッグ] メニューの [開始] をクリックしてアプリケーションを実行する代わりに [アタッチ先] を使用してアプリケーションをデバッグ。
最適化されたコードのデバッグ
ビルド エラーによって新しいバージョンのビルドが失敗した後の旧バージョンのデバッグ
カスタム コンパイラ (cl.exe) パスの使用。 セキュリティ上の理由から、エディット コンティニュ中のファイルの再コンパイルの場合、Visual Studio では常に、インストールされているコンパイラが使用されます。 カスタム コンパイラ パスを使用している場合 (たとえば、
*.props
ファイル内のカスタム$(ExecutablePath)
変数により)、警告が表示され、Visual Studio は同じバージョンとアーキテクチャのインストール済みコンパイラを使用するようにフォールバックします。レガシ アーキテクチャ、VC ツールセット。 VC 140 ツールセットの既定のデバッガーでは、X86 と X64 の両方のアプリケーションでエディット コンティニュがサポートされます。 レガシ ツールセットでは、X86 アプリケーションのみがサポートされます。 VC 120 より古いツールセットでは、エディット コンティニュを使用するには、"[デバッグ] > [オプション] > [全般] >" [ネイティブ互換モードの使用] をオンにして、レガシ デバッガーを使用する必要があります。
リンクに関する制限事項
エディット コンティニュを無効にするリンカー オプション
次のリンカー オプションを使用すると、エディット コンティニュが無効になります。
/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) ファイルの作成を禁止するオプションを設定すると、特定の警告は表示されずにエディット コンティニュが無効になります。
自動再リンクの制限事項
既定では、エディット コンティニュはデバッグ セッションの最後でプログラムを再リンクして、最新の実行可能ファイルを作成します。
エディット コンティニュでは、元のビルド位置とは異なる位置でデバッグすると、プログラムを再リンクできません。 手動でリビルドする必要があることを示すメッセージが表示されます。
エディット コンティニュでは、スタティック ライブラリはリビルドされません。 エディット コンティニュを使用してスタティック ライブラリに変更を加えた場合は、手動でライブラリをリビルドし、それを使用してアプリケーションを再リンクする必要があります。
エディット コンティニュは、カスタム ビルド ステップを呼び出しません。 プログラムがカスタム ビルドのステップを使用する場合は、カスタム ビルドのステップを呼び出せるように、手動でリビルドすることもできます。 この場合は、エディット コンティニュから手動によるリビルドの確認を受けた後、再リンクを無効にできます。
エディット コンティニュの後に再リンクを無効にするには
[デバッグ] メニューの [オプションと設定]をクリックします。
[オプション] ダイアログ ボックスの [デバッグ] ノードの下で、 [エディット コンティニュ] ノードをクリックします。
[デバッグ後にコードの変更点を再リンクする] チェック ボックスをオフにします。
プリコンパイル済みヘッダーの制限事項
既定では、エディット コンティニュがプリコンパイル済みヘッダーをバックグラウンドで読み込みおよび処理して、コード変更の処理を高速化します。 プリコンパイル済みヘッダーを読み込むには、物理メモリを割り当てる必要があります。このため、RAM が不足しているコンピューターでコンパイルする場合、問題が発生する可能性があります。 デバッグ時に Windows タスク マネージャーを使って使用できる物理メモリの量を確認することにより、メモリの量が問題になるかどうかを調べることができます。 使用できる物理メモリの量がプリコンパイル済みヘッダーのサイズを超える場合、エディット コンティニュに問題は生じません。 この量がプリコンパイル済みヘッダーのサイズより小さい場合は、エディット コンティニュがプリコンパイル済みヘッダーをバックグラウンドで読み込まないようにできます。
エディット コンティニュがプリコンパイル済みヘッダーをバックグラウンドで読み込まないようにするには
[デバッグ] メニューの [オプションと設定]をクリックします。
[オプション] ダイアログ ボックスの [デバッグ] ノードの下で、 [エディット コンティニュ] ノードをクリックします。
[プリコンパイルを許可する] チェック ボックスをオフにします。
IDL 属性の制限事項
エディット コンティニュでは、インターフェイス定義言語 (IDL) ファイルは再生成されません。 このため、デバッグ時に IDL 属性への変更は反映されません。 IDL 属性の変更結果を表示するには、デバッグを停止し、アプリをリビルドする必要があります。 エディット コンティニュでは、IDL 属性が変更されているとエラーや警告は生成されません。 詳細については、「 IDL 属性」を参照してください。
問題の診断
上記の条件のいずれにも該当しないシナリオの場合は、次の DWORD レジストリ値を設定して詳細を収集できます。
- 開発者コマンド プロンプトを開きます。
- 次のコマンドを実行します。
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
デバッグ セッションの開始時にこの値を設定すると、エディット コンティニュのさまざまなコンポーネントから、出力ウィンドウ>[デバッグ] ペインに詳細ログが出力されます。