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.
Artikel ini menjelaskan opsi compiler mana yang harus diatur untuk memungkinkan Anda men-debug kode yang dioptimalkan dengan lebih baik.
Pengalaman yang lebih baik tersedia mulai Visual Studio 2022 versi 17.14 yang memungkinkan Anda men-debug kode yang dioptimalkan seolah-olah dikompilasi tidak optimal, sambil mempertahankan kecepatan kode yang dioptimalkan. Untuk informasi selengkapnya, lihat C++ Dynamic Debugging (Pratinjau).
Nota
Kotak dialog dan perintah menu yang Anda lihat mungkin berbeda dari yang dijelaskan dalam Bantuan bergantung pada pengaturan atau edisi aktif Anda. Untuk mengubah pengaturan Anda, pilih Pengaturan Impor dan Ekspor pada menu Alat. Untuk informasi selengkapnya, lihat Atur ulang semua pengaturan.
Nota
Opsi pengompilasi /Zo (Enhance Optimized Debugging), yang diperkenalkan di Visual Studio Update 3, menghasilkan informasi debugging yang lebih mendetail untuk kode yang dioptimalkan (proyek yang tidak dibangun dengan opsi pengompilasi /Od). Lihat opsi /O (Optimalkan Kode)). Ini termasuk dukungan yang ditingkatkan untuk men-debug variabel lokal dan fungsi yang di-inlin.
Edit dan Lanjutkan dinonaktifkan saat opsi pengompilasi /Zo digunakan.
Saat pengkompilasi mengoptimalkan kode, kompilator memposisikan ulang dan mengatur ulang instruksi. Ini menghasilkan kode yang dikompilasi yang lebih efisien. Karena pengaturan ulang ini, debugger tidak selalu dapat mengidentifikasi kode sumber yang sesuai dengan serangkaian instruksi.
Pengoptimalan dapat memengaruhi:
Pengoptimal dapat menghapus variabel lokal atau memindahkannya ke lokasi yang tidak dipahami debugger.
Posisi di dalam fungsi, yang diubah ketika pengoptimal menggabungkan blok kode.
Nama fungsi untuk frame dalam tumpukan panggilan, yang mungkin salah jika pengoptimalisasi menggabungkan dua fungsi.
Bingkai yang Anda lihat pada tumpukan panggilan hampir selalu benar, asalkan Anda memiliki simbol untuk semua bingkai. Bingkai pada tumpukan panggilan akan salah jika Anda mengalami kerusakan tumpukan, jika Anda memiliki fungsi yang ditulis dalam bahasa assembly, atau jika ada bingkai sistem operasi tanpa simbol yang cocok pada tumpukan panggilan.
Variabel global dan statis selalu ditampilkan dengan benar. Begitu juga tata letak struktur. Jika Anda memiliki penunjuk ke struktur dan nilai pointer sudah benar, setiap variabel anggota struktur akan menunjukkan nilai yang benar.
Karena keterbatasan ini, Anda harus men-debug menggunakan versi program Anda yang tidak optimal jika memungkinkan. Secara default, pengoptimalan dinonaktifkan dalam konfigurasi Debug program C++ dan diaktifkan dalam konfigurasi Rilis.
Namun, bug mungkin hanya muncul dalam versi program yang dioptimalkan. Dalam hal ini, Anda harus men-debug kode yang dioptimalkan.
Untuk mengaktifkan pengoptimalan dalam konfigurasi build Debug
Saat Anda membuat proyek baru, pilih target
Win32 Debug. Gunakan targetWin32 Debughingga program Anda sepenuhnya di-debug dan Anda siap untuk membangun targetWin32 Release. Pengkompilasi tidak mengoptimalkan targetWin32 Debug.Pilih proyek di Penjelajah Solusi.
Pada menu Tampilan, klik Halaman Properti.
Dalam kotak dialog Halaman Properti, pastikan
Debugdipilih di menu tarik-turun Konfigurasi .Di tampilan folder di sebelah kiri, pilih folder C/C++.
Di bawah folder C++, pilih
Optimization.Di daftar properti di sebelah kanan, temukan
Optimization. Pengaturan di sebelahnya mungkin mengatakanDisabled (/Od). Pilih salah satu opsi lainnya (Minimum Size``(/O1),Maximum Speed``(/O2),Full Optimization``(/Ox), atauCustom).Jika Anda memilih opsi
CustomuntukOptimization, Anda sekarang dapat mengatur opsi untuk salah satu properti lain yang diperlihatkan dalam daftar properti.Pilih Properti Konfigurasi, C/C++, simpul Baris Perintah halaman properti proyek, dan tambahkan
(/Zo)ke kotak teks Opsi Tambahan.Peringatan
Menambahkan
/Zomenonaktifkan Edit dan Lanjutkan.Saat Anda men-debug kode yang dioptimalkan, gunakan jendela Disassembly untuk melihat instruksi apa yang dibuat dan dijalankan. Saat Anda mengatur titik henti, Anda perlu tahu bahwa titik henti mungkin bergerak bersama dengan instruksi. Misalnya, pertimbangkan kode berikut:
for (x=0; x<10; x++)
Misalkan Anda mengatur titik henti pada baris ini. Anda mungkin mengharapkan titik henti mencapai 10 kali, tetapi jika kode dioptimalkan, titik henti hanya mengenai satu kali. Itu karena instruksi pertama menetapkan nilai x ke 0. Pengompilasi mengenali bahwa hal ini hanya perlu dilakukan sekali dan memindahkannya keluar dari perulangan. Breakpoint bergerak bersamanya. Instruksi yang membandingkan dan menaikkan x tetap berada di dalam perulangan. Saat Anda melihat jendela Disassembly, unit langkah secara otomatis diatur ke Instruksi agar mendapatkan kontrol yang lebih besar, yang berguna saat Anda menelusuri kode yang dioptimalkan.