Olası yinelenen .NET'te Visual Studio Sürümünde Hata Ayıklama
Visual Studio'da Debug ve Release arasındaki fark nedir?
Olası yinelenen .NET'te Visual Studio Sürümünde Hata Ayıklama
Visual Studio'da Debug ve Release arasındaki fark nedir?
Yanıtlar:
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.
"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:
"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.
Ç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.
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).
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 .
Ç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.
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.
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 ...
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 .
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. .
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.