Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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.
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; }Ubah daftar dropdown Konfigurasi Solusi menjadi Rilis. Pastikan bahwa menu dropdown solusi platform diatur ke x64.
Bangun kembali dengan memilih Build>Rebuild Solution.
Atur titik henti pada baris 55,
int neighbors = countNeighbors(grid, i, j);diupdateGrid(). Jalankan program.Saat Anda mencapai titik henti, lihatlah jendela Lokal. Pada menu utama, pilih Debug>Windows>Locals. Perhatikan bahwa Anda tidak dapat melihat nilai
iataujdi jendela Lokal . Pengompilasi telah mengoptimalkan dan menghapusnya.Cobalah untuk mengatur titik henti pada baris 19,
cout << (grid[i][j] ? '*' : ' ');diprintGrid(). Anda tidak bisa. Perilaku ini diharapkan karena pengkompilasi mengoptimalkan kode.
Hentikan program dan aktifkan C++ Dynamic Debugging dan coba lagi
Di Penjelajah Solusi, klik kanan proyek dan pilih Properti untuk membuka halaman properti proyek.
Pilih Tingkat Lanjut>Gunakan C++ Penelusuran Kesalahan Dinamis, dan ubah pengaturan menjadi Ya.
Halaman properti terbuka pada Properti Konfigurasi > Tingkat Lanjut > Gunakan C++ Dynamic Debugging. Properti diatur ke Ya.
Langkah ini menambahkan sakelar
/dynamicdeoptke kompilator dan linker. Di balik layar, ini juga menonaktifkan sakelar/GLpengoptimalan 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.Bangun kembali dengan memilih Build>Rebuild Solution. Kode diagnostik build
MSB8088muncul, 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
MSB8088diperlakukan sebagai peringatan, tetapi mungkin diperlakukan sebagai kesalahan dalam versi Visual Studio di masa mendatang.Jalankan ulang aplikasi.
Sekarang saat Anda mencapai titik henti pada baris 55, Anda akan melihat nilai
idanjdi jendela Lokal . Jendela Call Stack menunjukkan bahwaupdateGrid()tidak optimal dan nama filenya adalahlife.alt.exe. Biner alternatif ini digunakan untuk men-debug kode yang dioptimalkan.
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
Coba atur titik henti lagi pada baris 19,
cout << (grid[i][j] ? '*' : ' ');diprintGrid(). Sekarang berhasil. Menetapkan titik henti dalam fungsi akan mengurangi optimisasinya sehingga Anda dapat melakukan debug secara normal.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 ketikagrid[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.
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.
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.
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.
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.
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
altbiner. 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
/dynamicdeoptkecl.exe,lib.exe, danlink.exe. Jika Anda menggunakan pustaka pihak ketiga dan tidak dapat membangunnya kembali, jangan gunakan/dynamicdeoptselama langkah akhirlink.exeuntuk menonaktifkan Debugging Dinamis pada biner tersebut. - Untuk menonaktifkan Penelusuran Kesalahan Dinamis dengan cepat untuk satu biner (misalnya,
test.dll), ganti nama atau hapusaltbiner (misalnya,test.alt.dll). - Untuk menonaktifkan Penelusuran Kesalahan Dinamis untuk satu atau beberapa
.cppfile, jangan sertakan/dynamicdeoptketika 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.
Salah satu cara untuk menemukan file Anda
BuildConfiguration.xmladalah 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.txtCari
Log.txtuntukBuildConfiguration.xml. Ini harus berisi garis sepertiReading configuration file from: C:\LyraStarterGame\Saved\UnrealBuildTool\BuildConfiguration.xmlUbah file tersebut
BuildConfiguration.xmluntuk 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.exedanalt.pdbdibuat. Untuktest.exedantest.pdb,test.alt.exedantest.alt.pdbharus ada di direktori yang sama. Pastikan bahwa pengaturan build yang benar diatur sesuai dengan artikel ini.Ada
debug directoryentri dalamtest.exeyang digunakan debugger untuk menemukan biner darialtyang akan digunakan untuk Debugging yang Dioptimalkan Kembali. Buka perintah Visual Studio asli x64 dan jalankanlink /dump /headers <your executable.exe>untuk melihat apakahdeoptada entri. Entrideoptmuncul di kolomType, 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.exedeoptJika entri direktori debug tidak ada, konfirmasikan bahwa Anda meneruskan/dynamicdeoptkecl.exe,lib.exe, danlink.exe.Deoptimisasi Dinamis tidak akan berfungsi secara konsisten jika
/dynamicdeopttidak diteruskan kecl.exe,lib.exedanlink.exeuntuk 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
Pada menu utama Visual Studio, pilih Build>Configuration Manager untuk membuka Configuration Manager.
Pilih daftar dropdown Konfigurasi lalu pilih <Baru...>.
Di Configuration Manager, di bawah Konteks proyek, daftar dropdown Konfigurasi terbuka dan
disorot. 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.
Bidang Nama diatur ke ReleaseDD. Daftar dropdown 'Salin pengaturan dari' disetel ke Rilis.
Konfigurasi baru muncul di daftar dropdown Konfigurasi solusi aktif . Pilih Tutup.
Dengan daftar dropdown Konfigurasi diatur ke ReleaseDD, klik kanan proyek Anda di Penjelajah Solusi dan pilih Properti.
Di Properti Konfigurasi>Tingkat lanjut, atur Gunakan Penelusuran Kesalahan Dinamis C++ ke Ya.
Pastikan bahwa Pengoptimalan Seluruh Program diatur ke Tidak.
Halaman properti dibuka ke Properti Konfigurasi > Opsi Lanjutan. Gunakan C++ Dynamic Debugging. Properti diatur ke Ya. Pengoptimalan Seluruh Program disetel ke Tidak.
Di Properti Konfigurasi>Linker>Pengoptimalan, pastikan bahwa Aktifkan lipatan COMDAT diatur ke Tidak (/OPT:NOICF).
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.
Pada menu utama Visual Studio, pilih Build>Configuration Manager untuk membuka Configuration Manager.
Pilih daftar dropdown Konfigurasi lalu pilih <Baru...>.
Di Configuration Manager, di bagian Konteks proyek dari jendela, daftar dropdown Konfigurasi terbuka dan
disorot. 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.
Bidang nama diatur ke DebugDD. Salin pengaturan dari: daftar dropdown diatur ke "Debug".
Konfigurasi baru muncul di daftar dropdown Konfigurasi solusi aktif . Pilih Tutup.
Dengan daftar dropdown Konfigurasi diatur ke DebugDD, klik kanan proyek Anda di Penjelajah Solusi dan pilih Properti.
Di Properti> KonfigurasiC/C++>Optimasi, aktifkan pengoptimalan yang Anda inginkan. Misalnya, Anda dapat mengatur Pengoptimalan ke Maksimalkan Kecepatan (/O2).
Di C/C++>Code Generation, atur Pemeriksaan Runtime Dasar ke Default.
Di C/C++>General, nonaktifkan Dukungan Just My Code Debugging.
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
/dynamicdeoptkecl.exe,lib.exe, danlink.exe. - Jangan gunakan
/ZI, salah satu dari/RTCbendera, atau/JMC.
Untuk distributor versi build:
- Untuk proyek bernama
test, pengkompilasi menghasilkantest.alt.obj, ,test.alt.exptest.obj, dantest.exp. Linker menghasilkantest.alt.exe,test.alt.pdb,test.exe, dantest.pdb. - Anda perlu menggunakan biner toolset baru
c2dd.dllbersamac2.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