Visual Studio'da Debug ve Release arasındaki fark nedir?


Yanıtlar:


114

En önemli şey, Hata Ayıklama modunda hiçbir optimizasyonun olmaması, Yayın modunda ise optimizasyonların olmasıdır. Bu önemlidir çünkü derleyici çok ileri düzeydedir ve kodunuzu oldukça zor ve düşük düzeyde iyileştirebilir. Sonuç olarak, kodunuzun bazı satırları hiçbir talimat olmadan bırakılabilir veya bazıları tamamen karışabilir. Adım adım hata ayıklama imkansız olacaktır. Ayrıca, yerel değişkenler genellikle gizemli şekillerde optimize edilir, bu nedenle Saatler ve Hızlı Saatler genellikle çalışmaz çünkü değişken "optimize edilmiştir". Ve çok sayıda başka optimizasyon da var. Bir ara optimize edilmiş .NET kodunda hata ayıklamayı deneyin ve göreceksiniz.

Diğer bir önemli fark, bu nedenle varsayılan Yayın ayarlarının kapsamlı hata ayıklama sembolü bilgileri oluşturmayla uğraşmamasıdır. Bu, fark etmiş olabileceğiniz .PDB dosyasıdır ve hata ayıklayıcının hangi montaj talimatlarının hangi kod satırına karşılık geldiğini vb.


1
"Sonuç olarak, kodunuzun bazı satırları hiçbir talimat olmadan bırakılabilir veya bazıları tamamen karışabilir". YUP, mevcut yöntemin / özelliğin adını almak için Yığın çerçevelerini kullanmakla suçlandı - ve birçok özellik sürümde satır içine
alındı

4
"En önemli şey, Hata Ayıklama modunda optimizasyon olmamasıdır" - bu tartışılabilir. en önemli şey, hata ayıklamanıza izin veren hata ayıklama bilgilerinin olmasıdır. ancak bu sürümde de var olabilir.
40'ta shoosh

Varsayılan modun hangisi olduğunu bilmiyorum (Debug / Release). Genel olarak benim deneyimlerime göre, tüm projeler hata ayıklama modunda ve kurulum ekibi pdb dosyasından kaçınmak ve optimizasyonu başlatmak için bu sürümle ilgilenecek. Ancak bugün, modun serbest bırakılması için değiştirildiği ve kırılma noktasını kullanarak kodu kıramadığım bir durumla karşılaştım. Bir çok şey yaparak uzun bir 1 saat denedim ve sonunda bunun mevcut derleme modundaki sorundan kaynaklandığını fark ettim. @ Vlix- Cevabınız için teşekkürler.
kbvishnu

1
Bu aslında, varsayılan Sürüm yapılandırmasına uygun bir uygulamada hata ayıklarken hemen pencerede bir sembolü analiz etmeye çalışırken karşılaştığım "'Değişken' adı mevcut bağlamda mevcut değil" sorununu çözmeme yardımcı oldu. Çok teşekkürler!
M463

1) Aşağıdaki sorunlar ne olacak? Bir ASP.NET MVC projesinde 3 yapılandırma vardır: base (web), debug (web.debug), release (web.release). Hata ayıklamayı ayarladığımızı ve ilgili yapılandırmaya dönüştürerek bağlantı dizesini yayınladığımızı varsayalım (hata ayıklama ve yayınlama). Yayınlarken, yayınlama iletişim kutusundaki seçimimize göre yayınlayabiliriz. Ancak, uygulamayı çalıştırırken, Hata Ayıkla'yı seçmeme rağmen, sürüm yapılandırmasını kullanıyor (çünkü temelde hata ayıklama yapılandırmasını ve hata ayıklama yapılandırmasını ayarladığım için), bu normal mi?
Jason

52

"Hata Ayıklama" ve "Yayın", aslında derlemenizi ve hata ayıklamanızı etkileyebilecek bir dizi ayar için yalnızca iki etikettir.

"Hata Ayıklama" modunda genellikle aşağıdakilere sahip olursunuz:

  • Program Hata Ayıklama Veritabanı dosyaları, programın çalıştırma sırasında kaynaktaki çalışmasını oldukça yakından takip etmenizi sağlar.
  • Değişkenlerin değerini incelemenizi ve aksi takdirde optimize edilmiş veya sıralı olabilecek işlevlerin izini sürmenizi sağlayan tüm optimizasyonlar kapalı
  • Örneğin, yalnızca hata ayıklama sırasında kullanılması gereken ASSERT enstrümanına kıyasla hata ayıklama modunda farklı davranan kod yazmanıza olanak tanıyan bir _DEBUG ön işlemci tanımı
  • Genellikle gerçek müşterilere dağıtılmayan (boyut ve güvenlik nedenleriyle) hata ayıklama seçenekleriyle de derlenmiş kitaplıklara bağlanma

"Yayın" modunda optimizasyonlar açıktır (birçok seçenek mevcut olsa da) ve _DEBUG ön işlemci tanımı tanımlanmamıştır. Genellikle yine de PDB dosyalarını oluşturmak isteyeceksiniz, çünkü işler daha hızlı ilerlerken yayın modunda "hata ayıklama" yapabilmek oldukça kullanışlıdır.


5
"sadece iki etiket" - aslında, Visual Studio size daha fazlasını yaratma yeteneği verir ! Bu, bir programı test ederken son derece yararlı olabilir. Örneğin, yakın zamanda işim için komut satırından dosya adlarını kabul eden bir program yazdım. Komut satırı çözümlememi test ettim, ancak bu yapıldıktan sonra CMD ve dosya adları listesiyle her gün uğraşmak istemedim; Sahte komut satırı değerleri sağlamak ve programın iş mantığını test etmek için koşullu derlemeyi kullanabileceğim bir konfigürasyon yarattım, bu da bana programın geliştirilmesinde çok daha hızlı bir yineleme döngüsü sağladı.
Brian S

9

Çoğunlukla, hata ayıklama, hata ayıklama sırasında yararlı olan birçok ek bilgi içerir. Yayın modunda, bunların tümü performans için kesilir ve takas edilir.


1) Aşağıdaki sorunlar ne olacak? Bir ASP.NET MVC projesinde 3 yapılandırma vardır: base (web), debug (web.debug), release (web.release). Hata ayıklamayı ayarladığımızı ve ilgili yapılandırmaya dönüştürerek bağlantı dizesini yayınladığımızı varsayalım (hata ayıklama ve yayınlama). Yayınlarken, yayınlama iletişim kutusundaki seçimimize göre yayınlayabiliriz. Ancak, uygulamayı çalıştırırken, Hata Ayıkla'yı seçmeme rağmen, sürüm yapılandırmasını kullanıyor (çünkü temelde hata ayıklama yapılandırmasını ve hata ayıklama yapılandırmasını ayarlıyorum), bu normal mi?
Jason

2) Uygulamayı Hata Ayıklama veya Yayınlama modunda çalıştırırken, VS temel web yapılandırmasını veya karşılık gelen web yapılandırmasını (web.debug.confg veya web.release.config) kullanıyor mu?
Jason

7

Proje derleme seçeneklerinden geçip bunları karşılaştırırsanız, farkların neler olduğunu görürsünüz.

Sorunun yerel / C ++ koduyla ilgili olduğunu varsayarsak (ifadeden tamamen açık değildir):

Temel olarak, Debug'da tüm kod oluşturma optimizasyonları kapalıdır. Bazı kitaplıklar (örn. STL ) varsayılan olarak daha katı hata denetimine (örn. Hata ayıklama yineleyiciler) sahiptir. Daha fazla hata ayıklama bilgisi üretilir (örn. "Düzenle ve Devam Et" için). Hataları yakalamak için kodda daha fazla şey üretilir (yerel değişken değerleri, başlatılmamış bir desene ayarlanır ve hata ayıklama yığını kullanılır).


2
@ Vilx: sorduğumda henüz .net etiketi yoktu, sadece visualstudio. Bu yüzden C ++ olduğunu varsaydım.
NeARAZ

6

Ayrıca, görünüşe göre, Hata Ayıklama modu, hata ayıklamaya yardımcı olmak için çok fazla iş parçacığı oluşturur. Bunlar, bir hata ayıklayıcı ekleyip eklemeseniz de işlemin ömrü boyunca aktif kalır. İlgili sorumu burada görün .


Ama sadece .NET için mi (C ++ değil)?
Peter Mortensen

6

Çok bariz söz değer demektir, yani yapı bayrakları farklı mantık için izin gerekir sadece değişim günlüğü ve "konsol" mesajlaşma için kullanılabilir, ancak olabilir istismar ve dramatik değil, sadece düşük düzeylerde ancak gerçek iş mantığını değiştirmek olabilir.


"... gerçek iş mantığını önemli ölçüde değiştirin" - bana bir hata gibi geliyor! Çok fazla koşullu kodumuz var ve anlaşılmasını gerçekten zorlaştırıyor. Ayrıca, koşullu kod bayraklarının her kombinasyonu , esasen yazılımınızın doğruluğu ve temel bütünlüğü sağlamak için test edilmesi gereken farklı bir sürümüdür. Yazılım yapımı İncil'im olan "Kod Tamamlandı" ya göre, "Temel Yönergemiz" karmaşıklığın yönetimidir. (Çözülmesi gereken 1 numaralı sorunumuz). Ayrım gözetmeden daha fazla koşullu bayrak eklemeden önce uzun ve sıkı düşünün!
MicroservicesOnDDD

Yukarıdaki yorumum, özellikle son cümleye kadar bu cevaba yönelik değildi ... bu sadece buraya gelen okuyucuların okuması gerektiğini düşündüğüm ek bir şeydi.
MicroservicesOnDDD

6

Ayrıca , örneğin MFC'yi kullanırken , hata ayıklama projelerinin, sürüm gibi yeniden dağıtılamayan DLL sürümlerine MFC90D.DLLbağlanacağını unutmayın.MFC90.DLL . Bu muhtemelen diğer çerçevelere benzer.

Bu nedenle, geliştirme amaçlı olmayan makinelerde hata ayıklama-oluşturma uygulamaları çalıştıramazsınız.


çok doğru. Bir müşterideyken bununla bir kez karşılaştım. My Machine (TM) üzerinde çalışıyor.
Matt Jacobsen

Onları dağıtabilirsiniz .. (buna izninizin olup olmadığını bilmiyorsunuz). Bunlar, uygulamanızın uygun şekilde adlandırılmış bir alt klasöründe bulunmalıdır.
Andreas Reiff

@Andreas Örneğimle ilgili olarak, "yeniden dağıtılamaz", Microsoft'un bunları dağıtmaya izin vermediği anlamına gelir .
53'te bildirildi.

4

Mevcut bir Sürüm yapı yapılandırmasından kopyalanan bir uygulama geliştirdiğimde bu soruyu da merak ettim.

Bu uygulamayı hata ayıklama modunda kullanmakla ilgilenen bir geliştiricim var, bu yüzden ReleaseMyBuild adının bir Release yapılandırmasından kopyalanmış olduğu bu yapı yapılandırmasını yapmak için ne gerektiğini merak ettim (ve bu nedenle tüm ayarların optimizasyonları serbest bırakmaya yönelik olması gerekir) ) ekipleri aniden değiştirmek ve kafa karıştırıcı yapı yapılandırma adına rağmen bir hata ayıklama yapısı haline gelmek.

Proje yapılandırmasının sadece bir isim olduğunu ve Joris Timmermans'ın bahsettiği "tüm ayar çeşitlerini" seçmenin uygun bir yolu olduğunu düşündüm. Optimize edilmiş bir sürüm olarak "FOO" adlı bir yapı yapılandırması işlevini yapan bu ayarların ne olabileceğini bilmek istedim yapısı .

İşte ona bir bakış. Visual Studio 2010'dan boş proje şablonundan yeni bir VCXPROJ oluşturdum. Daha sonra onu kopyaladım ve her ikisini de düzenledim, ilki hata ayıklama içeriğini, ikincisi de yayın içeriğini. İşte ilgili farklılıklara odaklanan fark ...

Boş VCXPROJs Hata Ayıklama ve Yayın Farkı

SERBEST BIRAKMAK

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

Bağlantı bölümünde her ikisinin de GenerateDebugInformationtrue olarak ayarlanması ilginçtir .


3

Gördüğünüz bariz fark, ikilinin boyutudur. Bir Hata Ayıklama derlemesi, bir Yayın yapısından daha büyük bir ikili dosya üretir.

Hata Ayıklamada derlerken, sembol tablosu kod dosyasının derlenmiş nesnesine eklenir ve bu da hata ayıklama programlarının bu ikili dosyalara erişmesine ve nesnelerin ve değişkenlerin değerlerine erişmesine izin verir.

Gözlemlenebilir başka bir fark, Yayın modunda, ikili programın Hata Ayıklama modundayken ölümcül bir hatayla çökmesi, Visual Studio'da uygulamada hata ayıklamaya başlarsanız, size hatalı ifadenin tam yerini söyleyen çağrı yığınını kontrol edebilirsiniz. .


-15

Tam farklılıkların ne olduğunu bilmiyorum çünkü aslında bu konuda kolayca elde edilebilecek hiçbir bilgi yok.

Ancak gözlenen temel fark, yayın sürümünün bazen ortaya çıkan DLL dosyasını bozması ve bu nedenle sizi web uygulamasını kullanılamaz hale getirmesidir.

Ne yazık ki, üretime hata ayıklama derlemesi koymanız gerekiyor. Ve evet, yayınlamak için eski güzel FTP kullanmanız gerekir.


7
Bu soruya nasıl cevap veriyor? Ve lütfen yazarken dikkat edin.
mmking

Benzer bir sorun yaşadım, kod hata ayıklama modunda çalışıyor, ancak yayın modunda sorun var. Görünüşe göre sorun benim kodumda. Yayın sürümündeki yaygın sorunlar hakkında harika bir makale var, umarım bu başkalarına da yardımcı olur.
Weihui Guo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.