Bagikan melalui


Debug Kode yang Dioptimalkan

Catatan

Kotak dialog dan perintah menu yang Anda lihat mungkin berbeda dari yang dijelaskan dalam Bantuan tergantung pada pengaturan atau edisi aktif Anda. Untuk mengubah pengaturan Anda, pilih Pengaturan Impor dan Ekspor pada menu Alat. Untuk informasi selengkapnya, lihat Mereset semua pengaturan.

Catatan

Opsi pengompilasi /Zo (Enhance Optimized Debugging) (diperkenalkan di Visual Studio Update 3) menghasilkan informasi debugging yang lebih kaya 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 sebaris.

Edit dan Lanjutkan dinonaktifkan saat opsi pengompilasi /Zo digunakan.

Ketika pengkompilasi mengoptimalkan kode, kompilasi mereposisi 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:

  • Variabel lokal, yang dapat dihapus oleh pengoptimal atau dipindahkan ke lokasi yang tidak dipahami debugger.

  • Posisi di dalam fungsi, yang diubah ketika pengoptimal menggabungkan blok kode.

  • Nama fungsi untuk bingkai pada tumpukan panggilan, yang mungkin salah jika pengoptimal menggabungkan dua fungsi.

    Bingkai yang Anda lihat pada tumpukan panggilan hampir selalu benar, namun, dengan asumsi Anda memiliki simbol untuk semua bingkai. Bingkai pada tumpukan panggilan akan salah jika Anda memiliki 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 penunjuk sudah benar, setiap variabel anggota struktur akan menampilkan nilai yang benar.

    Karena keterbatasan ini, Anda harus melakukan debug menggunakan versi program 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

  1. Saat Anda membuat proyek baru, pilih target Win32 Debug. Gunakan target Win32 Debug hingga program Anda sepenuhnya di-debug dan Anda siap untuk membangun target Win32 Release. Pengkompilasi tidak mengoptimalkan target Win32 Debug.

  2. Pilih proyek di Penjelajah Solusi.

  3. Pada menu Tampilan, klik Halaman Properti.

  4. Dalam kotak dialog Halaman Properti, pastikan Debug dipilih di daftar drop-down Konfigurasi.

  5. Dalam tampilan folder di sebelah kiri, pilih folder C/C++.

  6. Di bawah folder C++, pilih Optimization.

  7. Di daftar properti di sebelah kanan, temukan Optimization. Pengaturan di sebelahnya mungkin mengatakan Disabled (/Od). Pilih salah satu opsi lainnya (Minimum Size``(/O1), Maximum Speed``(/O2), Full Optimization``(/Ox), atau Custom).

  8. Jika Anda memilih opsi Custom untuk Optimization, Anda sekarang dapat mengatur opsi untuk salah satu properti lain yang diperlihatkan dalam daftar properti.

  9. Pilih Properti Konfigurasi, C/C++, simpul Baris Perintah halaman properti proyek, dan tambahkan (/Zo) ke kotak teks Opsi Tambahan.

    Peringatan

    Menambahkan /Zo akan menonaktifkan Edit dan Lanjutkan.

    Saat Anda men-debug kode yang dioptimalkan, gunakan jendela Pembongkaran untuk melihat instruksi apa yang benar-benar dibuat dan dijalankan. Saat Anda mengatur titik henti, Anda perlu tahu bahwa titik henti mungkin bergerak bersama dengan instruksi. Sebagai contoh, perhatikan 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 menjadi 0. Kompilator mengakui bahwa ini hanya harus dilakukan sekali dan memindahkannya keluar dari perulangan. Titik henti bergerak dengannya. Instruksi yang membandingkan dan menambah x tetap berada di dalam loop. Saat Anda melihat jendela Pembongkaran, unit langkah secara otomatis disetel ke Instruksi untuk kontrol yang lebih besar, yang berguna saat Anda menelusuri kode yang dioptimalkan.