W programie Visual Studio 2010 dla projektu C #, jeśli przejdziesz do właściwości projektu> kompilacja> zaawansowane> informacje o debugowaniu, masz trzy opcje: brak, pełne lub tylko pdb. Opierając się na odpowiedzi na to pytanie , uważam, że rozumiem niektóre różnice między pełnym a tylko PDB. Które jednak jest bardziej odpowiednie w przypadku kompilacji wydania? Jeśli użyję opcji „full”, czy będzie to miało wpływ na wydajność? Jeśli użyję „tylko pdb”, czy trudniej będzie debugować problemy produkcyjne?
Jaka jest różnica między „full” a „pdbonly”? https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/debug-compiler-option
c#
visual-studio
debugging
build
debug-symbols
RationalGeek
źródło
źródło
Odpowiedzi:
Budowałbym z
pdb-only
. Nie będzie można dołączyć debugera do wydanego produktu, ale jeśli pojawi się zrzut awaryjny , możesz użyć programu Visual Studio lub WinDBG do zbadania śladów stosu i zrzutów pamięci w czasie awarii.Jeśli wybierzesz
full
zamiastpdb-only
, uzyskasz te same korzyści, z wyjątkiem tego, że plik wykonywalny można dołączyć bezpośrednio do debugera. Musisz ustalić, czy jest to uzasadnione, biorąc pod uwagę Twój produkt i klientów.Pamiętaj, aby zapisać gdzieś pliki PDB, aby móc się do nich odwoływać, gdy nadejdzie raport o awarii. Jeśli możesz skonfigurować serwer symboli do przechowywania tych symboli debugowania, tym lepiej.
Jeśli zdecydujesz się budować z
none
, nie będziesz mieć możliwości odwołania się w przypadku awarii w terenie. Nie będzie można przeprowadzić żadnego badania po fakcie, co może poważnie utrudnić śledzenie problemu.Uwaga dotycząca wydajności:
Zarówno John Robbins, jak i Eric Lippert napisali na blogu posty dotyczące
/debug
flagi i obaj wskazują, że to ustawienie ma zerowy wpływ na wydajność . Istnieje osobna/optimize
flaga, która określa, czy kompilator powinien przeprowadzać optymalizacje.źródło
If you use /debug:full, be aware that there is some impact on the speed and size of JIT optimized code and a small impact on code quality with /debug:full. We recommend /debug:pdbonly or no PDB for generating release code.
OSTRZEŻENIE Dokumentacja MSDN dla przełącznika / debug (w programie Visual Studio jest to informacja o debugowaniu) wydaje się być nieaktualna! To jest to, co jest nieprawidłowe
Więc co jest teraz prawdą?
Jeśli są dokładnie takie same, dlaczego mamy te opcje? John Robbins (bóg debugowania systemu Windows) odkrył, że istnieją z powodów historycznych.
następnie udowadnia to.
Teraz optymalizacja jest częścią osobnego przełącznika
/optimize
(w Visual Studio nazywa się toOptimize code
).Krótko mówiąc, niezależnie od ustawienia DebugInfo pdb-only lub full, uzyskamy te same wyniki. Zaleca się unikanie None, ponieważ pozbawiłoby to możliwości analizowania zrzutów awaryjnych z wydanego produktu lub dołączania debugera.
źródło
Release
domyślnym typem debugowania konfiguracji ustawionym napdbonly
.Będziesz chciał tylko PDB, ale nie będziesz chciał udostępniać plików PDB użytkownikom. Jednak posiadanie ich dla siebie, wraz z plikami binarnymi, daje możliwość załadowania zrzutów awaryjnych do debugera, takiego jak WinDbg, i sprawdzenia, gdzie faktycznie zawiódł program. Może to być przydatne, gdy kod ulega awarii na komputerze, do którego nie masz dostępu.
Pełne debugowanie dodaje atrybut [Debuggable] do kodu. Ma to ogromny wpływ na prędkość. Na przykład niektóre optymalizacje pętli mogą być wyłączone, aby ułatwić wykonywanie pojedynczych kroków. Ponadto ma niewielki wpływ na proces JIT, ponieważ włącza śledzenie.
źródło
Jestem w trakcie pisania procedury obsługi nieobsługiwanego wyjątku, a ślad stosu zawiera numer wiersza, gdy używane jest tylko pdb, w przeciwnym razie po wybraniu opcji Brak po prostu otrzymuję nazwę Sub / Function.
Jeśli nie rozpowszechnię pliku .pdb, nie otrzymam numeru wiersza w śladzie stosu, nawet w przypadku kompilacji z samym pdb.
Tak więc rozpowszechniam (wdrażanie XCOPY w sieci LAN) pdb wraz z exe z mojej aplikacji VB.
źródło