Apa perbedaan antara Debug dan Rilis di Visual Studio?

Jawaban:

114

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.

Vilx-
sumber
1
"Akibatnya beberapa baris kode Anda mungkin tertinggal tanpa instruksi sama sekali, atau beberapa mungkin tercampur". YUP, lakukan pelanggaran ini menggunakan Stack frames untuk mendapatkan nama metode / properti saat ini - dan banyak properti yang disisipkan dalam rilis ...
kpollock
4
"Yang paling penting adalah dalam mode Debug tidak ada pengoptimalan" - itu bisa diperdebatkan. yang paling penting adalah terdapat informasi debug yang memungkinkan Anda melakukan debug. meskipun itu bisa ada dalam rilis juga.
shoosh
Saya tidak tahu mana yang merupakan mode default (Debug / Rilis). Secara umum menurut pengalaman saya semua proyek berada dalam mode debug dan tim penginstal akan menangani rilis ini untuk menghindari file pdb, dan untuk memperkenalkan pengoptimalan. Tetapi hari ini saya menemukan situasi di mana mode diubah menjadi rilis dan saya tidak dapat memecahkan kode menggunakan break point. Saya mencoba lama 1 jam melakukan banyak hal dan akhirnya saya perhatikan bahwa itu karena masalah dengan mode kompilasi saat ini. @ Vlix- Terima kasih atas jawaban Anda.
kbvishnu
1
Ini benar-benar membantu saya untuk memecahkan masalah "Nama 'variabel' tidak ada dalam konteks saat ini" yang saya temui saat mencoba menganalisis simbol dalam jendela langsung saat men-debug aplikasi yang sesuai dengan konfigurasi Rilis default. Terima kasih banyak!
M463
1) Bagaimana dengan masalah berikut? Ada 3 konfigurasi dalam proyek ASP.NET MVC: base (web), debug (web.debug), rilis (web.release). Asumsikan kita menyetel debug dan melepaskan string koneksi dengan transformasi ke konfigurasi yang sesuai (debug dan rilis). Saat mempublikasikan, kita dapat mempublikasikan sesuai dengan pilihan kita di dialog terbitkan. Tetapi, ketika menjalankan aplikasi, meskipun saya memilih Debug, itu menggunakan konfigurasi rilis (karena saya menetapkan konfigurasi debug di konfigurasi dasar dan debug), apakah itu normal?
Jason
52

"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:

  • File Program Debug Database, yang memungkinkan Anda mengikuti eksekusi program secara dekat di sumber selama waktu proses.
  • Semua pengoptimalan dinonaktifkan, yang memungkinkan Anda untuk memeriksa nilai variabel dan menelusuri fungsi yang mungkin telah dioptimalkan atau disisipkan
  • Definisi praprosesor _DEBUG yang memungkinkan Anda menulis kode yang bekerja secara berbeda dalam mode debug dibandingkan dengan rilis, misalnya ke ASSERT instrumen yang hanya boleh digunakan saat debugging
  • Menautkan ke pustaka yang juga telah dikompilasi dengan opsi debugging aktif, yang biasanya tidak diterapkan ke pelanggan sebenarnya (karena alasan ukuran dan keamanan)

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.

Joris Timmermans
sumber
5
"hanya dua label" - pada kenyataannya, Visual Studio memberi Anda kemampuan untuk membuat lebih banyak! Ini bisa sangat berguna saat menguji program. Misalnya, saya baru-baru ini menulis program untuk pekerjaan saya yang menerima nama file dari baris perintah. Saya menguji parsing baris perintah saya, tetapi setelah itu selesai, saya tidak ingin mengacaukan CMD dan daftar nama file setiap hari; Saya membuat konfigurasi yang dapat saya gunakan dengan kompilasi bersyarat untuk menyediakan nilai baris perintah tiruan dan menguji logika bisnis program, yang memberi saya siklus iterasi yang jauh lebih cepat pada pengembangan program.
Brian S
9

Biasanya, debug menyertakan banyak informasi tambahan yang berguna saat men-debug. Dalam mode rilis, ini semua dipotong dan diperdagangkan untuk kinerja.

Rik
sumber
1) Bagaimana dengan masalah berikut? Ada 3 konfigurasi dalam proyek ASP.NET MVC: base (web), debug (web.debug), rilis (web.release). Asumsikan kita menyetel debug dan melepaskan string koneksi dengan transformasi ke konfigurasi yang sesuai (debug dan rilis). Saat mempublikasikan, kita dapat mempublikasikan sesuai dengan pilihan kita di dialog terbitkan. Tetapi, ketika menjalankan aplikasi, meskipun saya memilih Debug, itu menggunakan konfigurasi rilis (karena saya menetapkan konfigurasi debug di konfigurasi dasar dan debug), apakah itu normal?
Jason
2) Saat menjalankan aplikasi dalam mode Debug atau Rilis, apakah VS menggunakan konfigurasi web dasar atau konfigurasi web yang sesuai (web.debug.confg atau web.release.config)?
Jason
7

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).

NeARAZ
sumber
2
@Vilx: ketika saya menjawab, belum ada tag .net, hanya visualstudio. Jadi saya berasumsi itu C ++.
NeARAZ
6

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 .

Matt Jacobsen
sumber
Tetapi hanya untuk .NET (bukan C ++)?
Peter Mortensen
6

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.

annakata
sumber
"... secara dramatis mengubah ... logika bisnis yang sebenarnya" - terdengar seperti bug bagi saya! Kami memiliki banyak kode bersyarat dan membuatnya sangat sulit untuk dipahami. Selain itu, setiap kombinasi tanda kode bersyarat pada dasarnya adalah versi berbeda dari perangkat lunak Anda yang harus diuji untuk memastikan kebenaran dan integritas dasar. Menurut "Code Complete", Alkitab saya tentang konstruksi perangkat lunak, "Petunjuk Utama" kami adalah pengelolaan kompleksitas. (Ini masalah # 1 kita untuk dipecahkan). Berpikirlah jauh-jauh hari sebelum menambahkan lebih banyak bendera bersyarat tanpa pandang bulu!
MicroservicesOnDDD
Komentar saya di atas tidak ditujukan pada jawaban ini khususnya untuk kalimat terakhir ... itu hanya tambahan yang menurut saya harus dibaca oleh pembaca yang datang ke sini.
MicroservicesOnDDD
6

Perhatikan juga bahwa ketika menggunakan MFC misalnya, proyek debug menautkan ke versi DLL yang tidak dapat didistribusikan ulang seperti MFC90D.DLLsementara 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.

foraidt
sumber
sangat benar. Bertentangan sekali ini saat berada di klien. Bekerja di Mesin Saya (TM).
Matt Jacobsen
Anda dapat mendistribusikannya .. (tidak tahu apakah Anda diizinkan). Mereka harus berada dalam subfolder dengan nama yang sesuai dari aplikasi Anda.
Andreas Reiff
@Andreas Mengenai contoh saya, "tidak dapat didistribusikan ulang" berarti Microsoft tidak mengizinkan pendistribusiannya.
dibayar
4

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 ...

Kosongkan VCXPROJs Debug vs Release diff

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 GenerateDebugInformationdisetel ke true.

jxramos.dll
sumber
3

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 .

fasih.rana
sumber
-15

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.

f470071
sumber
7
Bagaimana ini menjawab pertanyaan? Dan harap diperhatikan saat Anda mengetik.
mmking
Saya mengalami masalah serupa, kode berfungsi dalam mode debug, tetapi memiliki masalah dalam mode rilis. Ternyata masalahnya ada di kode saya. Ada artikel bagus tentang masalah umum dalam versi rilis. Semoga ini bisa membantu orang lain juga.
Weihui Guo