Bagikan melalui


Penelusuran Kesalahan Dinamis C++ (Pratinjau)

Penting

Debugging Dinamis C++ saat ini dalam pratinjau. Informasi ini berkaitan dengan fitur prarilis yang mungkin dimodifikasi secara substansial sebelum rilis. Microsoft tidak memberikan jaminan, tersurat maupun tersirat, sehubungan dengan informasi yang diberikan di sini.

Fitur pratinjau ini, tersedia dimulai dengan Visual Studio 2022 Versi 17.14 Pratinjau 2, hanya berlaku untuk proyek x64.

Dengan C++ Dynamic Debugging, Anda dapat men-debug kode yang dioptimalkan seolah-olah tidak optimal. Fitur ini berguna untuk pengembang yang memerlukan manfaat performa kode yang dioptimalkan, seperti pengembang game yang membutuhkan kecepatan bingkai tinggi. Dengan C++ Dynamic Debugging, Anda dapat menikmati pengalaman debugging kode yang tidak optimal tanpa mengorbankan keuntungan performa build yang dioptimalkan.

Debugging kode yang dioptimalkan memberikan tantangan. Kompilator mereposisi dan mengatur ulang instruksi untuk mengoptimalkan kode. Hasilnya adalah kode yang lebih efisien, tetapi itu berarti:

  • Pengoptimal dapat menghapus variabel lokal atau memindahkannya ke lokasi yang tidak diketahui oleh debugger.
  • Kode di dalam fungsi mungkin tidak lagi selaras dengan kode sumber saat pengoptimal menggabungkan blok kode.
  • Nama fungsi untuk fungsi pada tumpukan panggilan mungkin salah jika pengoptimal menggabungkan dua fungsi.

Di masa lalu, pengembang menangani masalah ini dan yang lain ketika mereka sedang dalam proses debugging kode yang dioptimalkan. Sekarang tantangan ini dihilangkan karena dengan C++ Dynamic Debugging Anda dapat melangkah ke kode yang dioptimalkan seolah-olah tidak optimal.

Selain menghasilkan biner yang dioptimalkan, mengkompilasi dengan /dynamicdeopt menghasilkan biner yang tidak dioptimalkan yang digunakan selama debugging. Ketika Anda menambahkan titik henti, atau masuk ke dalam fungsi (termasuk fungsi __forceinline), debugger memuat biner yang belum dioptimalkan. Kemudian Anda dapat men-debug kode yang tidak optimal untuk fungsi alih-alih kode yang dioptimalkan. Anda dapat men-debug seolah-olah Anda men-debug kode yang tidak optimal saat Anda masih mendapatkan keuntungan performa dari kode yang dioptimalkan di sisa program.

Cobalah Pemecahan Masalah Dinamis C++

Pertama, mari kita tinjau bagaimana rasanya men-debug kode yang dioptimalkan. Kemudian Anda dapat melihat bagaimana C++ Dynamic Debugging menyederhanakan proses.

  1. Buat proyek aplikasi konsol C++ baru di Visual Studio. Ganti konten file ConsoleApplication.cpp dengan kode berikut:

    // Code generated by GitHub Copilot
    #include <iostream>
    #include <chrono>
    #include <thread>
    
    using namespace std;
    
    int step = 0;
    const int rows = 20;
    const int cols = 40;
    
    void printGrid(int grid[rows][cols])
    {
        cout << "Step: " << step << endl;
        for (int i = 0; i < rows; ++i)
        {
            for (int j = 0; j < cols; ++j)
            {
                cout << (grid[i][j] ? '*' : ' ');
            }
            cout << endl;
        }
    }
    
    int countNeighbors(int grid[rows][cols], int x, int y)
    {
        int count = 0;
        for (int i = -1; i <= 1; ++i)
        {
            for (int j = -1; j <= 1; ++j)
            {
                if (i == 0 && j == 0)
                {
                    continue;
                }
    
                int ni = x + i;
                int nj = y + j;
                if (ni >= 0 && ni < rows && nj >= 0 && nj < cols)
                {
                    count += grid[ni][nj];
                }
            }
        }
        return count;
    }
    
    void updateGrid(int grid[rows][cols])
    {
        int newGrid[rows][cols] = { 0 };
        for (int i = 0; i < rows; ++i)
        {
            for (int j = 0; j < cols; ++j)
            {
                int neighbors = countNeighbors(grid, i, j);
                if (grid[i][j] == 1)
                {
                    newGrid[i][j] = (neighbors < 2 || neighbors > 3) ? 0 : 1;
                }
                else
                {
                    newGrid[i][j] = (neighbors == 3) ? 1 : 0;
                }
            }
        }
        // Copy newGrid back to grid
        for (int i = 0; i < rows; ++i)
        {
            for (int j = 0; j < cols; ++j)
            {
                grid[i][j] = newGrid[i][j];
            }
        }
    }
    
    int main()
    {
        int grid[rows][cols] = { 0 };
    
        // Initial configuration (a simple glider)
        grid[1][2] = 1;
        grid[2][3] = 1;
        grid[3][1] = 1;
        grid[3][2] = 1;
        grid[3][3] = 1;
    
        while (true)
        {
            printGrid(grid);
            updateGrid(grid);
            std::this_thread::sleep_for(std::chrono::milliseconds(100));
            cout << "\033[H\033[J"; // Clear the screen
            step++;
        }
    
        return 0;
    }
    
  2. Ubah daftar dropdown Konfigurasi Solusi menjadi Rilis. Pastikan bahwa menu dropdown solusi platform diatur ke x64.

  3. Bangun kembali dengan memilih Build>Rebuild Solution.

  4. Atur titik henti pada baris 55, int neighbors = countNeighbors(grid, i, j); di updateGrid(). Jalankan program.

  5. Saat Anda mencapai titik henti, lihatlah jendela Lokal. Pada menu utama, pilih Debug>Windows>Locals. Perhatikan bahwa Anda tidak dapat melihat nilai i atau j di jendela Lokal . Pengompilasi telah mengoptimalkan dan menghapusnya.

  6. Cobalah untuk mengatur titik henti pada baris 19, cout << (grid[i][j] ? '*' : ' '); di printGrid(). Anda tidak bisa. Perilaku ini diharapkan karena pengkompilasi mengoptimalkan kode.

Hentikan program dan aktifkan C++ Dynamic Debugging dan coba lagi

  1. Di Penjelajah Solusi, klik kanan proyek dan pilih Properti untuk membuka halaman properti proyek.

  2. Pilih Tingkat Lanjut>Gunakan C++ Penelusuran Kesalahan Dinamis, dan ubah pengaturan menjadi Ya.

    Cuplikan layar yang memperlihatkan properti proyek tingkat lanjut.

    Halaman properti terbuka pada Properti Konfigurasi > Tingkat Lanjut > Gunakan C++ Dynamic Debugging. Properti diatur ke Ya.

    Langkah ini menambahkan sakelar /dynamicdeopt ke kompilator dan linker. Di balik layar, ini juga menonaktifkan sakelar /GL pengoptimalan C++ dan /OPT:ICF. Pengaturan ini tidak menimpa pengalih yang Anda tambahkan secara manual ke baris perintah atau pengalih pengoptimalan lain yang disetel, seperti /O1.

  3. Bangun kembali dengan memilih Build>Rebuild Solution. Kode diagnostik build MSB8088 muncul, yang menunjukkan bahwa debugging dinamis dan pengoptimalan seluruh program tidak kompatibel. Kesalahan ini berarti bahwa seluruh pengoptimalan program (/GL) secara otomatis dimatikan selama kompilasi.

    Anda dapat menonaktifkan seluruh pengoptimalan program secara manual di properti proyek. Pilih Properti> KonfigurasiPengoptimalan Seluruh Program>, dan ubah pengaturan menjadi Nonaktif. Sekarang MSB8088 diperlakukan sebagai peringatan, tetapi mungkin diperlakukan sebagai kesalahan dalam versi Visual Studio di masa mendatang.

  4. Jalankan ulang aplikasi.

    Sekarang saat Anda mencapai titik henti pada baris 55, Anda akan melihat nilai i dan j di jendela Lokal . Jendela Call Stack menunjukkan bahwa updateGrid() tidak optimal dan nama filenya adalah life.alt.exe. Biner alternatif ini digunakan untuk men-debug kode yang dioptimalkan.

    Cuplikan layar yang memperlihatkan pemecahan masalah fungsi updateGrid.

    Titik henti ditampilkan dalam fungsi updateGrid. Call stack menunjukkan bahwa fungsi tersebut tidak dioptimalkan dan nama filenya life.alt.exe. Jendela Lokal menunjukkan nilai i dan j dan variabel lokal lainnya dalam fungsi .

    Fungsi updateGrid() ini dideoptimasi sesuai permintaan karena Anda mengatur titik henti di dalamnya. Jika Anda melangkahi fungsi yang telah dioptimalkan saat men-debug, maka fungsi tersebut tidak akan kehilangan optimasinya. Jika Anda melangkah ke fungsi, fungsi tersebut akan dideoptimasi. Cara utama untuk menyebabkan fungsi menjadi tidak optimal adalah jika Anda mengatur titik henti di dalamnya atau melangkah ke dalamnya.

    Anda juga dapat mendeoptimasi fungsi di jendela Call Stack . Klik kanan fungsi, atau grup fungsi yang dipilih, dan pilih Deoptimisasi pada entri berikutnya. Fitur ini berguna ketika Anda ingin melihat variabel lokal dalam fungsi yang dioptimalkan yang belum Anda atur titik henti di tempat lain pada tumpukan panggilan. Fungsi yang dideoptimasi dengan cara ini dikelompokkan bersama di jendela Breakpoints sebagai grup breakpoint yang diberi nama Deoptimized Functions. Jika Anda menghapus grup titik henti, fungsi terkait kembali ke status yang dioptimalkan.

Menggunakan titik henti kondisional dan dependen

  1. Coba atur titik henti lagi pada baris 19, cout << (grid[i][j] ? '*' : ' '); di printGrid(). Sekarang berhasil. Menetapkan titik henti dalam fungsi akan mengurangi optimisasinya sehingga Anda dapat melakukan debug secara normal.

  2. Klik kanan titik henti pada baris 19, pilih Kondisi, dan atur kondisi ke i == 10 && j== 10. Lalu pilih kotak centang Hanya aktifkan saat titik henti berikut ini ditemui: . Pilih titik henti pada baris 55 dari menu dropdown. Sekarang titik henti pada baris 19 tidak akan aktif sampai titik henti pada baris 50 diaktifkan terlebih dahulu, dan kemudian ketika grid[10][10] akan mengeluarkan ke konsol.

    Intinya adalah Anda dapat mengatur titik henti kondisional dan dependen dalam fungsi yang dioptimalkan dan menggunakan variabel lokal dan baris kode yang dalam build yang dioptimalkan mungkin tidak tersedia untuk debugger.

    Cuplikan layar yang memperlihatkan pengaturan titik henti kondisi untuk baris 19.

    Titik henti kondisional ditampilkan pada baris 19, cout < < (grid[i][j] ? '*' : ' ');. Kondisi diatur ke i == 10 && j == 10. Kotak centang untuk "Hanya aktifkan saat titik henti berikut ini ditemui" telah dipilih. Daftar dropdown titik henti diatur ke life.cpp baris 55.

  3. Lanjutkan menjalankan aplikasi. Saat titik henti pada baris 19 tercapai, Anda dapat mengklik kanan baris 15 dan memilih Atur Pernyataan Berikutnya untuk menjalankan ulang perulangan lagi.

    Cuplikan layar yang memperlihatkan debugging fungsi printGrid.

    Titik henti kondisional dan dependen ditemui pada baris 19, cout < < (grid[i][j] ? '*' : ' ');. Jendela Lokal menunjukkan nilai i dan j dan variabel lokal lainnya dalam fungsi . Jendela Call Stack menunjukkan fungsi tidak dioptimalkan dan nama file adalah life.alt.exe.

  4. Hapus semua titik henti untuk mengembalikan fungsi yang tidak optimal ke status yang dioptimalkan. Pada menu utama Visual Studio, pilihDebug Hapus Semua Titik Henti>. Semua fungsi kemudian kembali ke status yang dioptimalkan.

    Jika Anda menambahkan titik henti melalui jendela Call StackDeoptimize pada opsi entri berikutnya , yang tidak kami lakukan dalam panduan ini, Anda dapat mengklik kanan grup Fungsi yang Dideoptimasi dan memilih Hapus untuk mengembalikan hanya fungsi dalam grup tersebut kembali ke status yang dioptimalkan.

    Cuplikan layar yang memperlihatkan jendela Titik Henti.

    Jendela Titik Henti memperlihatkan grup Fungsi yang Dideoptimasi. Grup dipilih dan menu konteks terbuka dengan Hapus Kelompok Titik Henti yang dipilih.

Nonaktifkan Penelusuran Kesalahan Dinamis C++

Anda mungkin perlu melakukan debug pada kode yang dioptimalkan tanpa dideoptimasi, atau menempatkan titik henti dalam kode yang dioptimalkan dan membuat kode tetap dioptimalkan ketika titik henti tercapai. Ada beberapa cara untuk menonaktifkan Penelusuran Kesalahan Dinamis atau mencegahnya mendeoptimasi kode saat Anda mencapai titik henti:

  • Pada menu utama Visual Studio, pilihOpsi>. Di panel Opsi, perluas bagianUmum>>. Kosongkan kotak centang Deoptimisasi fungsi yang di-debug secara otomatis jika memungkinkan (.NET 8+, C++ Dynamic Debugging). Lain kali debugger dimulai, kode tetap dioptimalkan.
  • Pada menu utama Visual Studio, pilihOpsi>. Dalam dialog Opsi, perluas bagian Penelusuran Kesalahan>Umum. Kosongkan kotak centang Deoptimisasi fungsi yang di-debug secara otomatis jika memungkinkan (.NET 8+, C++ Dynamic Debugging). Lain kali debugger dimulai, kode tetap dioptimalkan.
  • Banyak titik henti debugging dinamis adalah dua titik henti: satu dalam biner yang dioptimalkan dan satu di biner yang tidak optimal. Di jendela Breakpoints, pilih Perlihatkan Kolom>Fungsi. Bersihkan titik henti yang terkait dengan alt biner. Titik henti lainnya dalam pasangan terputus dalam kode yang dioptimalkan.
  • Saat Anda melakukan debug, pada menu utama Visual Studio, pilih Debug>Windows>Disassembly. Pastikan bahwa ia memiliki fokus. Ketika Anda masuk ke fungsi melalui jendela Pembongkaran, fungsi tidak akan dideoptimasi.
  • Nonaktifkan penelusuran kesalahan dinamis sepenuhnya dengan tidak meneruskan /dynamicdeopt ke cl.exe, lib.exe, dan link.exe. Jika Anda menggunakan pustaka pihak ketiga dan tidak dapat membangunnya kembali, jangan gunakan /dynamicdeopt selama langkah akhir link.exe untuk menonaktifkan Debugging Dinamis pada biner tersebut.
  • Untuk menonaktifkan Penelusuran Kesalahan Dinamis dengan cepat untuk satu biner (misalnya, test.dll), ganti nama atau hapus alt biner (misalnya, test.alt.dll).
  • Untuk menonaktifkan Penelusuran Kesalahan Dinamis untuk satu atau beberapa .cpp file, jangan sertakan /dynamicdeopt ketika membangunnya. Sisa proyek Anda dibangun dengan Debugging Dinamis.

Aktifkan Debugging Dinamis C++ untuk Unreal Engine 5.6 atau yang lebih baru

Unreal Engine 5.6 mendukung C++ Dynamic Debugging untuk Unreal Build Tool dan Unreal Build Accelerator. Ada dua cara untuk mengaktifkannya. Ubah BuildConfiguration.xml file atau Ubah Targets.cs file.

Mengubah BuildConfiguration.xml file

Di Visual Studio, pilih konfigurasi Editor Pengembangan dan ubah BuildConfiguration.xml untuk menyertakan <bDynamicDebugging>true</bDynamicDebugging>. Untuk informasi selengkapnya tentang BuildConfiguration.xml dan lokasinya, lihat Konfigurasi Build.

  1. Salah satu cara untuk menemukan file Anda BuildConfiguration.xml adalah dengan menjalankan build dan memeriksa output log build. Misalnya, saat membangun Game Lyra Starter, Anda akan melihat output seperti ini:

    - Running UnrealBuildTool: dotnet "..\..\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool.dll" LyraEditor Win64 Development -Project="C:\LyraStarterGame\LyraStarterGame.uproject" ...
     14% -   Log file: C:\Users\<user>\AppData\Local\UnrealBuildTool\Log.txt
    
  2. Cari Log.txt untuk BuildConfiguration.xml. Ini harus berisi garis seperti Reading configuration file from: C:\LyraStarterGame\Saved\UnrealBuildTool\BuildConfiguration.xml

  3. Ubah file tersebut BuildConfiguration.xml untuk memuat <bDynamicDebugging>true</bDynamicDebugging>:

    <?xml version="1.0" encoding="utf-8" ?>
    <Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
        <WindowsPlatform>
            <bDynamicDebugging>true</bDynamicDebugging> <!-- add this line -->
        </WindowsPlatform>
    </Configuration>
    

Mengubah Targets.cs file

Cara lain untuk mengaktifkan C++ Dynamic Debugging untuk Unreal Build Tool dan Unreal Build Accelerator adalah dengan memodifikasi file Anda Target.cs agar berisi WindowsPlatform.bDynamicDebugging = true.

Proyek Unreal Engine memiliki Target.cs file yang terkait dengan beberapa jenis target, termasuk:

{ProjectName}.Target.cs for the game executable.
{ProjectName}Editor.Target.cs for the editor build.

Untuk sebuah build editor, dalam file {ProjectName}Editor.Target.cs, tambahkan WindowsPlatform.bDynamicDebugging = true; ke konstruktor.

public class LyraEditorTarget : TargetRules
{
    public LyraEditorTarget(TargetInfo Target) : base(Target)
    {
        Type = TargetType.Editor;

        WindowsPlatform.bDynamicDebugging = true; // add this line
        // Other settings...
    }
}

Atau untuk build game, dalam {ProjectName}.Target.cs file, tambahkan WindowsPlatform.bDynamicDebugging = true; ke ApplyShared{Project name}TargetSettings():

internal static void ApplySharedLyraTargetSettings(TargetRules Target)
{
    ILogger Logger = Target.Logger;
    
    WindowsPlatform.bDynamicDebugging = true; // add this line
    // Other settings...
}

Untuk informasi selengkapnya tentang file target Unreal Engine, lihat Target.

Aktifkan Debugging Dinamis C++ untuk Unreal Engine 5.5 atau yang lebih lama

Untuk Unreal Engine 5.5 atau yang lebih lama, pilih perubahan Unreal Build Tool dari GitHub ke repositori Anda.

Nota

Untuk mengakses repositori Epik di GitHub, Anda memerlukan akun Epic dan akun GitHub terdaftar.

Setelah Anda memilih perubahan yang akan diterapkan ke repositori Anda, aktifkan bDynamicDebugging seperti yang dijelaskan sebelumnya. Anda juga perlu menggunakan Unreal Build Accelerator dari Unreal Engine 5.6. Gunakan bit terbaru dari ue5-main, atau nonaktifkan UBA dengan menambahkan yang berikut ke BuildConfiguration.xml:

<BuildConfiguration>
    <bAllowUBAExecutor>false</bAllowUBAExecutor>
    <bAllowUBALocalExecutor>false</bAllowUBALocalExecutor>
</BuildConfiguration>

Untuk informasi selengkapnya tentang mengonfigurasi cara Unreal Engine dibangun, lihat Konfigurasi Build.

Pemecahan masalah

Jika titik henti tidak berfungsi dalam fungsi yang terdeoptimasikan:

  • Jika Anda keluar dari bingkai [Deoptimized], Anda mungkin berada dalam kode yang telah dioptimalkan, kecuali jika pemanggilnya dideoptimasi karena ada titik henti di dalam kode tersebut, atau Anda memasuki pemanggil saat menuju ke fungsi saat ini.

  • Pastikan file alt.exe dan alt.pdb dibuat. Untuk test.exe dan test.pdb, test.alt.exe dan test.alt.pdb harus ada di direktori yang sama. Pastikan bahwa pengaturan build yang benar diatur sesuai dengan artikel ini.

  • Ada debug directory entri dalam test.exe yang digunakan debugger untuk menemukan biner dari alt yang akan digunakan untuk Debugging yang Dioptimalkan Kembali. Buka perintah Visual Studio asli x64 dan jalankan link /dump /headers <your executable.exe> untuk melihat apakah deopt ada entri. Entri deopt muncul di kolom Type, seperti yang ditunjukkan pada baris terakhir dari contoh ini:

      Debug Directories
    
            Time Type        Size      RVA  Pointer
        -------- ------- -------- -------- --------
        67CF0DA2 cv            30 00076330    75330    Format: RSDS, {7290497A-E223-4DF6-9D61-2D7F2C9F54A0}, 58, D:\work\shadow\test.pdb
        67CF0DA2 feat          14 00076360    75360    Counts: Pre-VC++ 11.00=0, C/C++=205, /GS=205, /sdl=0, guardN=204
        67CF0DA2 coffgrp      36C 00076374    75374
        67CF0DA2 deopt         22 00076708    75708    Timestamp: 0x67cf0da2, size: 532480, name: test.alt.exe
    

    deopt Jika entri direktori debug tidak ada, konfirmasikan bahwa Anda meneruskan /dynamicdeopt ke cl.exe, lib.exe, dan link.exe.

  • Deoptimisasi Dinamis tidak akan berfungsi secara konsisten jika /dynamicdeopt tidak diteruskan ke cl.exe, lib.exe dan link.exe untuk semua .cpp, .lib, dan file biner. Pastikan bahwa sakelar yang tepat diatur saat Anda mengembangkan proyek Anda.

Untuk informasi selengkapnya tentang masalah yang diketahui, lihat Debugging Dinamis C++: Kemampuan Debugging Penuh untuk Build yang Dioptimalkan.

Jika semuanya tidak berfungsi seperti yang diharapkan, buka tiket di Komunitas Pengembang. Sertakan informasi sebanyak mungkin tentang masalah ini.

Catatan umum

IncrediBuild 10.24 mendukung pembangunan C++ Dynamic Debugging.
FastBuild v1.15 mendukung build C++ Dynamic Debugging.

Fungsi yang dijalankan sebaris dideoptimasi sesuai kebutuhan. Jika Anda mengatur titik henti pada fungsi inlined, debugger akan mendeoptimasi fungsi dan pemanggilnya. Titik henti terjadi pada tempat yang Anda prediksi, seolah-olah program Anda dibangun tanpa pengoptimalan oleh kompilator.

Fungsi tetap tidak optimal bahkan jika Anda menonaktifkan titik henti di dalamnya. Anda harus menghapus titik henti agar fungsi kembali ke status yang dioptimalkan.

Banyak titik henti debugging dinamis adalah dua titik henti: satu dalam biner yang dioptimalkan dan satu di biner yang tidak optimal. Untuk alasan ini, Anda melihat lebih dari satu titik henti di jendela Titik Henti .

Bendera kompilator yang digunakan untuk versi yang dideoptimasi sama dengan bendera yang digunakan untuk versi yang dioptimalkan, kecuali untuk bendera pengoptimalan dan /dynamicdeopt. Perilaku ini berarti bahwa setiap bendera yang Anda atur untuk menentukan makro, dan sebagainya, diatur dalam versi yang tidak optimal juga.

Kode yang dideoptimasi tidak sama dengan kode debug. Kode yang tidak optimal dikompilasi dengan bendera pengoptimalan yang sama dengan versi yang dioptimalkan, sehingga menegaskan dan kode lain yang mengandalkan pengaturan khusus debug tidak disertakan.

Integrasi sistem build

Debugging Dinamis C++ mengharuskan parameter pada kompilator dan linker diatur dengan cara tertentu. Berikut adalah bagian yang menjelaskan cara menyiapkan konfigurasi khusus untuk Debugging Dinamis yang tidak memiliki sakelar yang berkonflik.

Jika proyek Anda dibangun dengan sistem build Visual Studio, cara yang baik untuk membuat konfigurasi Debugging Dinamis adalah dengan menggunakan Configuration Manager untuk mengkloning konfigurasi Rilis atau Debug Anda dan membuat perubahan untuk mengakomodasi Debugging Dinamis. Dua bagian berikut menjelaskan prosedurnya.

Membuat konfigurasi Rilis baru

  1. Pada menu utama Visual Studio, pilih Build>Configuration Manager untuk membuka Configuration Manager.

  2. Pilih daftar dropdown Konfigurasi lalu pilih <Baru...>.

    Cuplikan layar yang memperlihatkan Configuration Manager.

    Di Configuration Manager, di bawah Konteks proyek, daftar dropdown Konfigurasi terbuka dan disorot.

  3. Dialog Konfigurasi Solusi Baru terbuka. Di bidang Nama , masukkan nama untuk konfigurasi baru, seperti ReleaseDD. Pastikan pengaturan Salin dari: diatur ke Rilis. Kemudian pilih OK untuk membuat konfigurasi baru.

    Cuplikan layar yang memperlihatkan dialog Konfigurasi Proyek Baru untuk build rilis.

    Bidang Nama diatur ke ReleaseDD. Daftar dropdown 'Salin pengaturan dari' disetel ke Rilis.

  4. Konfigurasi baru muncul di daftar dropdown Konfigurasi solusi aktif . Pilih Tutup.

  5. Dengan daftar dropdown Konfigurasi diatur ke ReleaseDD, klik kanan proyek Anda di Penjelajah Solusi dan pilih Properti.

  6. Di Properti Konfigurasi>Tingkat lanjut, atur Gunakan Penelusuran Kesalahan Dinamis C++ ke Ya.

  7. Pastikan bahwa Pengoptimalan Seluruh Program diatur ke Tidak.

    Cuplikan layar yang memperlihatkan properti proyek tingkat lanjut.

    Halaman properti dibuka ke Properti Konfigurasi > Opsi Lanjutan. Gunakan C++ Dynamic Debugging. Properti diatur ke Ya. Pengoptimalan Seluruh Program disetel ke Tidak.

  8. Di Properti Konfigurasi>Linker>Pengoptimalan, pastikan bahwa Aktifkan lipatan COMDAT diatur ke Tidak (/OPT:NOICF).

    Cuplikan layar yang memperlihatkan properti proyek pengoptimalan Linker.

    Halaman properti dibuka ke Properti Konfigurasi > Linker > Pengoptimalan > Pengaktifan Lipatan CMDAT. Properti diatur ke opsi Tidak (/OPT:NOICF).

Pengaturan ini menambahkan sakelar /dynamicdeopt ke kompilator dan linker. Dengan sakelar /GL pengoptimalan C++ dan /OPT:ICF juga dinonaktifkan, Anda sekarang dapat membangun dan menjalankan proyek Anda dalam konfigurasi baru saat Anda menginginkan build rilis yang dioptimalkan yang dapat Anda gunakan dengan C++ Dynamic Debugging.

Anda dapat menambahkan sakelar lain yang Anda gunakan dengan build ritel Anda ke konfigurasi ini sehingga Anda selalu mengaktifkan atau menonaktifkan sakelar yang Anda harapkan saat menggunakan Debugging Dinamis. Untuk informasi selengkapnya tentang sakelar yang tidak dapat digunakan dengan Debugging Dinamis, lihat Opsi yang tidak kompatibel.

Untuk informasi selengkapnya tentang konfigurasi di Visual Studio, lihat Membuat dan mengedit konfigurasi.

Membuat konfigurasi Debug baru

Jika Anda ingin menggunakan biner debug tetapi Anda ingin berjalan lebih cepat, Anda dapat mengubah konfigurasi Debug Anda.

  1. Pada menu utama Visual Studio, pilih Build>Configuration Manager untuk membuka Configuration Manager.

  2. Pilih daftar dropdown Konfigurasi lalu pilih <Baru...>.

    Cuplikan layar yang memperlihatkan Configuration Manager.

    Di Configuration Manager, di bagian Konteks proyek dari jendela, daftar dropdown Konfigurasi terbuka dan disorot.

  3. Dialog Konfigurasi Proyek Baru terbuka. Di bidang Nama , masukkan nama untuk konfigurasi baru, seperti DebugDD. Pastikan pengaturan Salin dari: diatur ke Debug. Kemudian pilih OK untuk membuat konfigurasi baru.

    Cuplikan layar yang memperlihatkan 'dialog Konfigurasi Proyek Baru' untuk build debug.

    Bidang nama diatur ke DebugDD. Salin pengaturan dari: daftar dropdown diatur ke "Debug".

  4. Konfigurasi baru muncul di daftar dropdown Konfigurasi solusi aktif . Pilih Tutup.

  5. Dengan daftar dropdown Konfigurasi diatur ke DebugDD, klik kanan proyek Anda di Penjelajah Solusi dan pilih Properti.

  6. Di Properti> KonfigurasiC/C++>Optimasi, aktifkan pengoptimalan yang Anda inginkan. Misalnya, Anda dapat mengatur Pengoptimalan ke Maksimalkan Kecepatan (/O2).

  7. Di C/C++>Code Generation, atur Pemeriksaan Runtime Dasar ke Default.

  8. Di C/C++>General, nonaktifkan Dukungan Just My Code Debugging.

  9. Atur Format Informasi Debug ke Database Program (/Zi).

Anda dapat menambahkan sakelar lain yang Anda gunakan dengan build debug ke konfigurasi ini sehingga Anda selalu mengaktifkan atau menonaktifkan sakelar yang Anda harapkan saat menggunakan Debugging Dinamis. Untuk informasi selengkapnya tentang sakelar yang tidak dapat digunakan dengan Debugging Dinamis, lihat Opsi yang tidak kompatibel.

Untuk informasi selengkapnya tentang konfigurasi di Visual Studio, lihat Membuat dan mengedit konfigurasi.

Pertimbangan sistem penyusunan kustom

Jika Anda memiliki sistem build kustom, pastikan Anda:

  • Teruskan /dynamicdeopt ke cl.exe, lib.exe, dan link.exe.
  • Jangan gunakan /ZI, salah satu dari /RTC bendera, atau /JMC.

Untuk distributor versi build:

  • Untuk proyek bernama test, pengkompilasi menghasilkan test.alt.obj, , test.alt.exptest.obj, dan test.exp. Linker menghasilkan test.alt.exe, test.alt.pdb, test.exe, dan test.pdb.
  • Anda perlu menggunakan biner toolset baru c2dd.dll bersama c2.dll.

Opsi yang tidak kompatibel

Beberapa opsi compiler dan linker tidak kompatibel dengan C++ Dynamic Debugging. Jika Anda mengaktifkan C++ Dynamic Debugging dengan menggunakan pengaturan proyek Visual Studio, opsi yang tidak kompatibel secara otomatis dinonaktifkan kecuali Anda secara khusus mengaturnya di pengaturan opsi baris perintah tambahan.

Opsi pengkompilasi berikut tidak kompatibel dengan C++ Dynamic Debugging:

/GH
/GL
/Gh
/RTC1 
/RTCc 
/RTCs 
/RTCu 
/ZI (/Zi is OK)
/ZW 
/clr 
/clr:initialAppDomain
/clr:netcore
/clr:newSyntax
/clr:noAssembly
/clr:pure
/clr:safe
/fastcap
/fsanitize=address
/fsanitize=kernel-address

Opsi linker berikut tidak kompatibel dengan C++ Dynamic Debugging:

/DEBUG:FASTLINK
/INCREMENTAL
/OPT:ICF  You can specify /OPT:ICF but the debugging experience may be poor

Lihat juga

Bendera pengkompilasi /dynamicdeopt (pratinjau)
Flag linker /DYNAMICDEOPT (pratinjau)
Debugging Dinamis C++: Kemampuan Debug Penuh untuk Build yang Dioptimalkan
Debug kode yang dioptimalkan