Zwolnij generowanie plików .pdb, dlaczego?

264

Dlaczego program Visual Studio 2005 generuje .pdbpliki podczas kompilacji w wersji? Nie będę debugować wersji wydania, więc dlaczego są one generowane?

m.edmondson
źródło
18
Po co generować pdb w czasie rzeczywistym? Więc kiedy raport o awarii pojawia się z natury, masz informacje, aby go debugować. Inną wartością jest to, że klienci mogą go debugować, gdy oryginalny autor tego nie zrobi.
Ian Boyd
@IanBoyd: drugie zdanie tego komentarza oznacza, że ​​wdrażasz PDB. Jest to w przeważającej większości przypadków niepożądane.
Widoczny
3
@IInspectable Or jest pożądane
Ian Boyd
@IanBoyd: zdecydowana większość przypadków nie obejmuje wdrożeń systemów operacyjnych. Poza tym te PDB nie zawierają prywatnych symboli, które są domyślnie dołączane podczas generowania PDB.
Widoczny
@ IInspectable Z drugiej strony, pożądane jest uwalnianie PBD . Idealnie, tak, każdy napisałby kod skompilowany do IL, abyśmy mogli sami uzyskać informacje o symbolach. Ale kompilatory kodu natywnego wciąż nie mają łatwego sposobu na obsługę debugowania w terenie.
Ian Boyd

Odpowiedzi:

416

Ponieważ bez plików PDB niemożliwe byłoby debugowanie kompilacji „Release” za pomocą czegoś innego niż debugowanie na poziomie adresu.Optymalizacje naprawdę mają wpływ na Twój kod, przez co bardzo trudno jest znaleźć winowajcę, jeśli coś pójdzie nie tak (powiedzmy, zgłoszono wyjątek). Nawet ustawienie punktów przerwania jest niezwykle trudne, ponieważ wierszy kodu źródłowego nie można dopasować jeden do jednego z (lub nawet w takiej samej kolejności jak) wygenerowanym kodem asemblera. Pliki PDB pomagają tobie i debuggerowi znacznie ułatwić debugowanie pośmiertne.

Chodzi o to, że jeśli oprogramowanie jest gotowe do wydania, do tego czasu należy wykonać wszystkie debugowanie. Chociaż jest to z pewnością prawda, należy pamiętać o kilku ważnych kwestiach:

  1. Powinieneś także przetestować i debugować swoją aplikację (przed jej wydaniem) za pomocą kompilacji „Release”. Wynika to z faktu, że włączenie optymalizacji (domyślnie są wyłączone w konfiguracji „Debugowanie”) może czasami powodować pojawienie się subtelnych błędów, których w innym przypadku nie złapałbyś. Podczas debugowania potrzebne będą symbole PDB.

  2. Klienci często zgłaszają przypadki i błędy, które pojawiają się tylko w „idealnych” warunkach. Są to rzeczy, które są prawie niemożliwe do odtworzenia w laboratorium, ponieważ opierają się na jakiejś dziwnej konfiguracji maszyny tego użytkownika. Jeśli są szczególnie pomocnymi klientami, zgłoszą zgłoszony wyjątek i podadzą ślad stosu. Albo nawet pozwolą ci pożyczyć ich maszynę do zdalnego debugowania oprogramowania. W obu przypadkach potrzebne będą pliki PDB.

  3. Profilowanie należy zawsze wykonywać w kompilacjach „Release” z włączonymi optymalizacjami. I znowu, pliki PDB są przydatne, ponieważ pozwalają na odwzorowanie instrukcji asemblowania z powrotem na kod źródłowy, który napisałeś.

Nie można wrócić i wygenerować plików PDB po kompilacji. * Jeśli nie stworzysz ich podczas kompilacji, stracisz swoją szansę. Ich tworzenie nie zaszkodzi. Jeśli nie chcesz ich rozpowszechniać, możesz po prostu pominąć je w plikach binarnych. Ale jeśli później zdecydujesz, że ich chcesz, nie masz szczęścia. Lepiej zawsze je generuj i archiwizuj kopię, na wypadek, gdybyś ich kiedykolwiek potrzebował.

Jeśli naprawdę chcesz je wyłączyć, zawsze jest to opcja. W oknie Właściwości projektu ustaw opcję „Informacje debugowania” na „brak” dla dowolnej konfiguracji, którą chcesz zmienić.

Należy pamiętać jednak, że „Debug” i „uwolnienie” konfiguracje zrobić domyślnie użyć innych ustawień dla emitujących informacje debugowania. Będziesz chciał zachować to ustawienie. Opcja „Informacje debugowania” jest ustawiona na „pełna” dla kompilacji debugowania, co oznacza, że ​​oprócz pliku PDB informacje o symbolach debugowania są osadzone w zestawie. Otrzymasz także symbole obsługujące ciekawe funkcje, takie jak edycja i kontynuacja. W trybie Release wybrana jest opcja „tylko pdb”, która, jak się wydaje, zawiera tylko plik PDB, bez wpływu na zawartość zestawu. Nie jest to tak proste, jak sama obecność lub brak plików PDB w /binkatalogu. Ale zakładając, że użyjesz opcji „tylko pdb”, plik PDB ”

* Jak zauważył Marc Sherman w komentarzu , dopóki twój kod źródłowy nie zmienił się (lub możesz pobrać oryginalny kod z systemu kontroli wersji), możesz go odbudować i wygenerować pasujący plik PDB. Przynajmniej zwykle. Działa to dobrze przez większość czasu, ale nie gwarantuje się , że kompilator generuje identyczne pliki binarne za każdym razem, gdy kompilujesz ten sam kod , więc mogą występować subtelne różnice. Co gorsza, jeśli w międzyczasie dokonałeś jakichkolwiek aktualizacji swojego zestawu narzędzi (takich jak zastosowanie dodatku Service Pack dla programu Visual Studio), PDB są jeszcze mniej prawdopodobne. Aby zagwarantować niezawodną generację ex postfactoPliki PDB, musisz zarchiwizować nie tylko kod źródłowy w systemie kontroli wersji, ale także pliki binarne dla całego łańcucha narzędzi kompilacji, aby zapewnić dokładne odtworzenie konfiguracji środowiska kompilacji. Oczywiste jest, że o wiele łatwiej jest po prostu tworzyć i archiwizować pliki PDB.

Cody Gray
źródło
19
„Nie można wygenerować plików PDB po kompilacji.” - Jeśli Twój kod źródłowy nie zmienił się, możesz przebudować, aby wygenerować użyteczny PDB po fakcie. Domyślnie windbg nie ładuje tego PDB, ale możesz go zmusić do załadowania, określając opcję / i w ten sposób .reload /i foo.dll. Spowoduje to załadowanie pliku foo.pdb, nawet jeśli plik foo.pdb został utworzony po wydaniu pliku foo.dll.
Marc Sherman
Zauważyłem, że każdy nowy kompilator ma inny skrót skrótu, więc istnieją niewielkie różnice w każdym kompilacji nawet w tym samym środowisku. Czy adresy PDB nie mogą się zmieniać z wariancją, stąd potrzeba powstrzymania PDB od tej wersji? Przedstawiam to jako pomysł, ponieważ tak naprawdę nie rozumiem, jak działają PDB ani dlaczego skróty zmieniają się między kompilacjami.
thebunnyrules
1
@ W przypisie odsyłam do artykułu wyjaśniającego, że „kompilator C # z założenia nigdy nie produkuje tego samego pliku binarnego dwa razy. Kompilator C # osadza świeżo wygenerowany identyfikator GUID w każdym zestawie za każdym razem, gdy go uruchamiasz, dzięki czemu nie ma dwóch zestawów są zawsze identyczne. ” To wyjaśnia, dlaczego ma inny skrót, a zatem inny plik PDB. Można to naprawić za pomocą edytora szesnastkowego, ale nie jest przyjazny dla użytkownika. A także poza zakresem tej odpowiedzi.
Cody Gray
3
W Roslyn pojawiła się nowa funkcja zwana kompilacjami deterministycznymi. „Flaga / deterministyczna powoduje, że kompilator emituje dokładnie ten sam plik EXE / DLL, bajt po bajcie, jeśli podano te same dane wejściowe.” Oznacza to, że projekt skompilowany pierwotnie przy użyciu tej flagi może zostać ponownie skompilowany do dokładnie tego samego pliku binarnego, o ile kompilowany kod jest taki sam. Dłuższe wyjaśnienie można znaleźć w Deterministycznych kompilacjach w Roslyn
K Smith
92

PDB można wygenerować zarówno dla, Releasejak i dla Debug. Ustawiono na (w VS2010, ale w VS2005 musi być podobny):

Projekt → Właściwości → Kompilacja → Zaawansowane → Informacje debugowania

Po prostu zmień na None.

Aliostad
źródło
2
Ale dlaczego miałbyś to zrobić? Jeśli twoje oprogramowanie jest gotowe do wydania, to do tego czasu powinieneś wykonać całe debugowanie
m.edmondson,
4
Ponieważ możesz debugować problemy produkcyjne. Kiedyś musieliśmy to zrobić.
Aliostad
21
Zaletą nagłówków PDB dla kodu produkcyjnego jest to, że .NET będzie używać tych plików podczas zgłaszania wyjątków. Generuje ślady stosu z nazwami plików i numerami linii, co często jest bardzo przydatne!
Steven
6
@ m.edmondson: Tak, zgadza się. Nadal będziesz informowany, jaki był (jak FileNotFoundException) zgłoszony wyjątek , ale nie będziesz w stanie zobaczyć śladu stosu. To sprawia, że ​​bardzo trudno jest dokładnie określić, która linia kodu spowodowała zgłoszenie wyjątku.
Cody Gray
2
@ m.edmondson Aby dodać, jeśli szukasz narzędzia do zdalnego debugowania jednego z problemów w polach produkcyjnych, zestaw Windows SDK zawiera bardzo znane narzędzie o nazwie WinDbg, które obsługuje zdalne debugowanie. Proszę spojrzeć na poniższy link. Mam nadzieję że to pomoże! msdn.microsoft.com/en-in/library/windows/hardware/…
RBT
8

Bez plików .pdb przejście przez kod produkcyjny jest praktycznie niemożliwe; musisz polegać na innych narzędziach, które mogą być kosztowne i czasochłonne. Rozumiem, że możesz na przykład użyć śledzenia lub windbg, ale tak naprawdę zależy to od tego, co chcesz osiągnąć. W niektórych scenariuszach chcesz po prostu przejść przez zdalny kod (bez błędów i wyjątków), używając danych produkcyjnych do obserwowania określonego zachowania, i tu właśnie przydają się pliki .pdb. Bez nich uruchomienie debugera dla tego kodu jest niemożliwe.

użytkownik1714880
źródło
7

Dlaczego masz pewność, że nie będziesz debugować kompilacji wersji? Czasami (mam nadzieję, że rzadko, ale zdarza się) możesz otrzymać raport o usterce od klienta, który z jakiegoś powodu nie jest powtarzalny w wersji debugowania (różne czasy, małe inne zachowanie lub cokolwiek innego). Jeśli problem wydaje się powtarzalny w kompilacji wydania, z przyjemnością otrzymasz pasujący plik pdb.

Jdehaan
źródło
5
@ m.edmondson Uzyskaj dostęp do zdalnego komputera za pomocą RDP, Webex itp. i zainstaluj tam windbg. Ustaw ścieżkę symboli i bam, jesteś złoty!
Marc Sherman
Przydałby się link do bardziej szczegółowego przewodnika. Ten poradnik może prowadzić ludzi (takich jak ja) na niewłaściwym torze. Większość deweloperów .NET na przykład nic nie wie o Windbg.
nuzzolilo
1
@ m.edmondson - Niektóre wersje programu Visual Studio mają możliwość przeprowadzania zdalnego debugowania. Z menu debugowania „dołączasz do procesu” na zdalnym komputerze.
Matthew
Czy zdalne debugowanie instancji aplikacji produkcyjnej jest tak dobrym pomysłem? Czy nie przerwie równoległego wykonywania wątków i nie zmusi ich do szeregowego uruchamiania podczas debugowania?
Kaveh Hadjari
4

Możesz także użyć zrzutów awaryjnych do debugowania oprogramowania. Klient wysyła go do Ciebie, a następnie możesz go użyć do zidentyfikowania dokładnej wersji Twojego źródła - a Visual Studio pobierze nawet odpowiedni zestaw symboli debugowania (i źródła, jeśli jesteś poprawnie skonfigurowany) za pomocą zrzutu awaryjnego. Zobacz dokumentację Microsoft dotyczącą sklepów z symbolami .

rlranft
źródło
2

Plik .PDB to krótka nazwa „Baza danych programu”. Zawiera informacje o punkcie debugowania debugera i używanych zasobach lub odwołanie. Jest generowany, gdy budujemy jako tryb debugowania. Pozwala aplikacji na debugowanie w czasie wykonywania.

Rozmiar to wzrost pliku .PDB w trybie debugowania. Jest używany podczas testowania naszej aplikacji.

Dobry artykuł z pliku pdb.

http://www.codeproject.com/Articles/37456/How-To-Inspect-the-Content-of-a-Program-Database-P

Ajay2707
źródło
1
„Nie ma potrzeby używania tego pliku po wydaniu lub wdrożeniu”, z wyjątkiem sytuacji, gdy ktoś doświadcza awarii w tej wydanej wersji, a otrzymany od niego raport o awarii nie zawiera śladu stosu do użycia ... wszystko.
Nyerguds
Nie prawda. Bez plików .pdb otrzymasz pełny stacktrace, ale bez nazw plików źródłowych. Możesz go odzyskać wewnętrznie po otrzymaniu raportu o awarii. Jeśli dbasz o swoje prawa intelektualne i zaciemniasz źródła, musisz zapisywać pliki .pdb, ale ich nie wdrażać.
TOP KEK
1

W rozwiązaniu obejmującym wiele projektów zwykle chcesz mieć jedną konfigurację, która nie generuje żadnych plików PDB ani XML. Zamiast zmieniać Debug Infowłaściwość każdego projektu na none, pomyślałem, że bardziej celowe byłoby dodanie zdarzenia po kompilacji, które działa tylko w określonej konfiguracji.

Niestety, Visual Studio nie pozwala na określenie różnych zdarzeń po kompilacji dla różnych konfiguracji. Zdecydowałem się to zrobić ręcznie, edytując csprojplik projektu startowego i dodając następujące (zamiast jakiegokolwiek istniejącego PostBuildEventznacznika):

  <PropertyGroup Condition="'$(Configuration)' == 'Publish'">
    <PostBuildEvent>
        del *.pdb
        del *.xml
    </PostBuildEvent>
  </PropertyGroup>

Niestety spowoduje to, że pole tekstowe zdarzenia po kompilacji będzie puste, a umieszczenie w nim wszystkiego może mieć nieprzewidywalne wyniki.

GregRos
źródło
4
Spowoduje to usunięcie WSZYSTKICH *.xmlplików, bądź ostrożny z tym.
Mariusz Jamro,
0

Symbole debugowania ( .pdb) i dokument XML ( .xml) stanowią duży procent całkowitego rozmiaru i nie powinny być częścią zwykłego pakietu wdrożeniowego. Ale powinien być możliwy dostęp do nich w razie potrzeby.

Jedno z możliwych podejść: pod koniec procesu kompilacji TFS przenieś je do osobnego artefaktu.

Mark Johanes
źródło
-1

W rzeczywistości bez plików PDB i posiadanych przez nich informacji symbolicznych niemożliwe byłoby utworzenie udanego raportu o awarii (pliki zrzutu pamięci), a Microsoft nie miałby pełnego obrazu, który spowodował problem.

Tak więc posiadanie PDB poprawia raportowanie awarii.

prosti
źródło
Ale czego dokładnie brakowałoby bez plików .pdb?
TOP KEK
Nie można wygenerować plików PDB po kompilacji. Tak więc każda wersja oprogramowania major.minor [.build [.revision]] powinna była zostać zapisana w firmie Microsoft, aby właściwie zrozumieć, co się stało, ale to nie wszystko.
prosti
Kompilator nie gwarantuje generowania identycznych plików binarnych za każdym razem, gdy kompilujesz ten sam kod.
prosti
Pytanie dotyczyło tego, czego będzie brakowało w raportach o awariach i jak wpłynie to na raportowanie o awariach. Pliki pdb .NET zawierają tylko prywatne nazwy zmiennych i nazwy plików źródłowych. Cała reszta (nazwy metod, podpisy itp.) Będzie przechowywana w stosie na podstawie informacji o metadanych.
TOP KEK
Żaden plik PDB nie zawiera również danych nieprywatnych : github.com/microsoft/microsoft-pdb .
prosti