Możliwe zduplikowane wydanie debugowania programu Visual Studio w .NET
Jaka jest różnica między debugowaniem a wydaniem w programie Visual Studio?
Możliwe zduplikowane wydanie debugowania programu Visual Studio w .NET
Jaka jest różnica między debugowaniem a wydaniem w programie Visual Studio?
Odpowiedzi:
Najważniejsze jest to, że w trybie debugowania nie ma optymalizacji, podczas gdy w trybie wydania są optymalizacje. Jest to ważne, ponieważ kompilator jest bardzo zaawansowany i może wykonać dość skomplikowane ulepszenie kodu na niskim poziomie. W rezultacie niektóre wiersze kodu mogą zostać pozostawione bez żadnych instrukcji lub niektóre mogą zostać pomieszane. Debugowanie krok po kroku byłoby niemożliwe. Ponadto zmienne lokalne są często optymalizowane w tajemniczy sposób, więc zegarki i zegarki QuickWatches często nie działają, ponieważ zmienna jest „zoptymalizowana”. Jest też mnóstwo innych optymalizacji. Spróbuj kiedyś debugować zoptymalizowany kod .NET, a zobaczysz.
Inną kluczową różnicą jest to, że z tego powodu domyślne ustawienia wydania nie zawracają sobie głowy generowaniem obszernych informacji o symbolach debugowania. To jest plik .PDB, który mogłeś zauważyć i pozwala debugerowi dowiedzieć się, które instrukcje asemblera odpowiadają której linii kodu itp.
„Debugowanie” i „Wydanie” to w rzeczywistości tylko dwie etykiety dla całej masy ustawień, które mogą wpływać na twoją kompilację i debugowanie.
W trybie „debugowania” zazwyczaj dostępne są:
W trybie „Release” optymalizacje są włączone (chociaż dostępnych jest wiele opcji), a definicja preprocesora _DEBUG nie jest zdefiniowana. Zwykle jednak nadal będziesz chciał generować pliki PDB, ponieważ bardzo przydatna jest możliwość „debugowania” w trybie wydania, gdy rzeczy działają szybciej.
Przeważnie debugowanie zawiera wiele dodatkowych informacji przydatnych podczas debugowania. W trybie wydania wszystko to jest wycinane i wymieniane na wydajność.
Jeśli przejrzysz opcje kompilacji projektu i porównasz je, zobaczysz, jakie są różnice.
Zakładając, że pytanie dotyczy kodu natywnego / C ++ (nie jest to do końca jasne ze sformułowania):
Zasadniczo w debugowaniu wszystkie optymalizacje generowania kodu są wyłączone. Niektóre biblioteki (np. STL ) domyślnie używają dokładniejszego sprawdzania błędów (np. Iteratory debugowania). Generowanych jest więcej informacji debugowania (np. Dla „Edytuj i kontynuuj”). Więcej rzeczy jest generowanych w kodzie w celu wychwytywania błędów (lokalne wartości zmiennych są ustawiane na niezainicjowany wzorzec i używana jest sterta debugowania).
Najwyraźniej tryb debugowania tworzy wiele dodatkowych wątków, które pomagają w debugowaniu. Pozostają one aktywne przez cały czas trwania procesu, niezależnie od tego, czy dołączysz debugger, czy nie. Zobacz moje powiązane pytanie tutaj .
Prawdopodobnie warto wspomnieć o bardzo oczywistym, że flagi kompilacji pozwalają na inną logikę, która powinna być używana tylko do zmiany rejestrowania i komunikatów "konsoli", ale może to być nadużywane i radykalnie zmienić nie tylko niskie poziomy, ale rzeczywistą logikę biznesową.
Należy również pamiętać, że podczas korzystania na przykład z MFC , debugowanie projektów łączy się z wersjami DLL nie podlegającymi redystrybucji, tak jak MFC90D.DLL
podczas gdy wydanie kompiluje łącze do wersji redystrybucyjnych, takich jakMFC90.DLL
. Jest to prawdopodobnie podobne do innych frameworków.
Dlatego prawdopodobnie nie będziesz w stanie uruchamiać aplikacji do debugowania na komputerach, które nie są programistyczne.
Zaciekawiło mnie również to pytanie, kiedy opracowałem aplikację skopiowaną z istniejącej konfiguracji kompilacji wydania.
Mam programistę, który jest zainteresowany używaniem tej aplikacji w trybie debugowania, więc zastanawiałem się, co trzeba zrobić, aby ta konfiguracja kompilacji, która istnieje o nazwie ReleaseMyBuild skopiowana z konfiguracji wydania (i dlatego powinna mieć wszystkie ustawienia dostosowane do optymalizacji wydania ), aby nagle zmienić zespoły i stać się kompilacją do debugowania pomimo mylącej nazwy konfiguracji kompilacji.
Pomyślałem, że konfiguracja projektu to tylko nazwa i wygodny sposób na wybranie „całej masy ustawień”, o których wspomina Joris Timmermans. Chciałem poznać szczegóły tego, jakie mogą być te ustawienia, które powodują, że konfiguracja kompilacji o nazwie „FOO” działa jako zoptymalizowana wersja wydania .
Oto jedno spojrzenie na to. Utworzyłem nowy VCXPROJ z pustego szablonu projektu z programu Visual Studio 2010. Następnie skopiowałem go i edytowałem oba, pierwszy, aby zachować zawartość debugowania, a drugi zawartość wydania. Oto różnica skupiona na istotnych różnicach ...
WYDANIE
<PropertyGroup>
<WholeProgramOptimization>true</WholeProgramOptimization>
<ClCompile>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
ODPLUSKWIĆ
<PropertyGroup>
<UseDebugLibraries>true</UseDebugLibraries>`
<ClCompile>
<Optimization>Disabled</Optimization>
Ciekawe, że w sekcji Link obaj mają GenerateDebugInformation
ustawili wartość true.
Oczywistą różnicą, jaką widzisz, jest rozmiar pliku binarnego. Kompilacja debugowania tworzy większy plik binarny niż kompilacja wydania.
Podczas kompilowania w Debug, tablica symboli jest dodawana do skompilowanego obiektu pliku kodu, co umożliwia debugowanie programów w celu uzyskania dostępu do tych plików binarnych i uzyskania dostępu do wartości obiektów i zmiennych.
Inną zauważalną różnicą jest to, że w trybie wydania plik binarny po prostu zawiesiłby się z powodu błędu krytycznego w trybie debugowania, jeśli zaczniesz debugować aplikację w programie Visual Studio, możesz sprawdzić stos wywołań, który informuje o dokładnej lokalizacji błędnej instrukcji .
Nie wiem, jakie są dokładne różnice, ponieważ w rzeczywistości nie ma łatwo dostępnych informacji na ten temat.
Ale główną zaobserwowaną różnicą jest to, że wersja wydania czasami uszkadza wynikowy plik DLL, a tym samym sprawia, że aplikacja, aplikacja internetowa nie nadaje się do użytku.
Niestety, musisz wprowadzić kompilację debugowania do produkcji. I tak, aby opublikować, musisz użyć starego dobrego FTP.