Kemungkinan duplikat Debug Visual Studio Rilis di .NET
Apa perbedaan antara Debug dan Rilis di Visual Studio?
Kemungkinan duplikat Debug Visual Studio Rilis di .NET
Apa perbedaan antara Debug dan Rilis di Visual Studio?
Jawaban:
Yang terpenting dalam mode Debug tidak ada optimasi, sedangkan pada mode Release ada optimasi. Ini penting karena kompilernya sangat mahir dan dapat melakukan beberapa peningkatan level rendah yang cukup rumit pada kode Anda. Akibatnya beberapa baris kode Anda mungkin tertinggal tanpa instruksi sama sekali, atau beberapa mungkin tercampur. Proses debug langkah demi langkah tidak mungkin dilakukan. Selain itu, variabel lokal sering kali dioptimalkan dengan cara yang misterius, jadi Jam Tangan dan QuickWatch sering tidak berfungsi karena variabel "dioptimalkan". Dan ada banyak pengoptimalan lainnya juga. Coba debugging kode .NET yang dioptimalkan kapan-kapan dan Anda akan melihatnya.
Perbedaan utama lainnya adalah karena ini pengaturan Rilis default tidak repot-repot membuat informasi simbol debug yang ekstensif. Itu adalah file .PDB yang mungkin telah Anda perhatikan dan memungkinkan debugger untuk mengetahui instruksi assembly mana yang sesuai dengan baris kode mana, dll.
"Debug" dan "Rilis" sebenarnya hanyalah dua label untuk keseluruhan banyak setelan yang dapat memengaruhi build dan debugging Anda.
Dalam mode "Debug" Anda biasanya memiliki yang berikut:
Dalam mode "Rilis", pengoptimalan diaktifkan (meskipun ada beberapa opsi yang tersedia) dan definisi praprosesor _DEBUG tidak ditentukan. Biasanya Anda masih ingin membuat file PDB, karena sangat berguna untuk dapat "men-debug" dalam mode rilis ketika semuanya berjalan lebih cepat.
Biasanya, debug menyertakan banyak informasi tambahan yang berguna saat men-debug. Dalam mode rilis, ini semua dipotong dan diperdagangkan untuk kinerja.
Jika Anda melihat opsi kompilasi proyek dan membandingkannya, Anda akan melihat apa perbedaannya.
Dengan asumsi pertanyaannya adalah tentang kode asli / C ++ (tidak sepenuhnya jelas dari ungkapan):
Pada dasarnya, di Debug semua pengoptimalan pembuatan kode tidak aktif. Beberapa perpustakaan (misalnya STL ) default untuk pemeriksaan kesalahan yang lebih ketat (misalnya debug iterator). Lebih banyak informasi debugging dihasilkan (mis. Untuk "Edit dan Lanjutkan"). Lebih banyak hal dibuat dalam kode untuk menangkap kesalahan (nilai variabel lokal disetel ke pola yang tidak diinisialisasi, dan tumpukan debug digunakan).
Selain itu, tampaknya, mode Debug membuat banyak utas tambahan untuk membantu proses debug. Ini tetap aktif selama berlangsungnya proses, terlepas dari apakah Anda memasang debugger atau tidak. Lihat pertanyaan terkait saya di sini .
Mungkin perlu disebutkan dengan sangat jelas, bahwa bendera build memungkinkan logika berbeda yang seharusnya digunakan hanya untuk mengubah logging dan pesan "konsol", tetapi dapat disalahgunakan dan secara dramatis mengubah tidak hanya level rendah, tetapi juga logika bisnis yang sebenarnya.
Perhatikan juga bahwa ketika menggunakan MFC misalnya, proyek debug menautkan ke versi DLL yang tidak dapat didistribusikan ulang seperti MFC90D.DLL
sementara rilis build link terhadap versi yang dapat didistribusikan ulang seperti MFC90.DLL
. Ini mungkin mirip dengan framework lainnya.
Oleh karena itu, Anda mungkin tidak dapat menjalankan aplikasi debug-build pada mesin non-pengembangan.
Saya juga penasaran dengan pertanyaan ini ketika saya telah mengembangkan aplikasi yang disalin dari konfigurasi build Rilis yang ada.
Saya memiliki pengembang yang tertarik menggunakan aplikasi itu dalam mode debug, jadi saya bertanya-tanya apa yang diperlukan untuk membuat konfigurasi build ini yang ada dengan nama ReleaseMyBuild yang disalin dari konfigurasi Rilis (dan karenanya harus memiliki semua pengaturan yang diarahkan untuk merilis pengoptimalan ) untuk tiba-tiba mengubah tim dan menjadi build debug meskipun nama konfigurasi build membingungkan.
Saya pikir konfigurasi proyek hanyalah sebuah nama dan cara mudah untuk memilih "seluruh pengaturan" yang disebutkan Joris Timmermans. Saya ingin mengetahui seluk-beluk dari pengaturan tersebut yang membuat konfigurasi build bernama "FOO" berfungsi sebagai rilis rilis yang dioptimalkan .
Berikut ini sekilas. Saya membuat VCXPROJ baru dari template proyek kosong dari Visual Studio 2010. Saya kemudian menyalinnya dan mengedit keduanya, yang pertama menyimpan konten debug dan yang kedua konten rilis. Inilah perbedaan yang berpusat pada perbedaan yang relevan ...
MELEPASKAN
<PropertyGroup>
<WholeProgramOptimization>true</WholeProgramOptimization>
<ClCompile>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
DEBUG
<PropertyGroup>
<UseDebugLibraries>true</UseDebugLibraries>`
<ClCompile>
<Optimization>Disabled</Optimization>
Menarik bahwa di bagian Tautan, keduanya telah GenerateDebugInformation
disetel ke true.
Perbedaan nyata yang bisa Anda lihat adalah ukuran biner. Build Debug menghasilkan biner yang lebih besar daripada build Rilis.
Saat mengompilasi di Debug, tabel simbol ditambahkan ke objek yang dikompilasi dari file kode yang memungkinkan program debug untuk memanfaatkan biner ini dan mengakses nilai objek dan variabel.
Perbedaan lain yang dapat diamati adalah bahwa, dalam mode Rilis, biner hanya akan crash pada kesalahan fatal saat dalam mode Debug, jika Anda mulai men-debug aplikasi di Visual Studio, Anda dapat memeriksa tumpukan panggilan yang memberi tahu Anda lokasi yang tepat dari pernyataan yang salah .
Saya tidak tahu apa perbedaan persisnya karena sebenarnya tidak ada informasi yang tersedia dengan mudah tentang itu.
Tetapi perbedaan utama yang diamati adalah bahwa versi rilis terkadang merusak file DLL yang dihasilkan dan dengan demikian membuat aplikasi Anda, aplikasi web tidak dapat digunakan.
Sayangnya, Anda harus menempatkan debug dalam produksi. Dan ya, untuk mempublikasikan Anda harus menggunakan FTP lama yang bagus.