Geben Sie die Generierung von PDF-Dateien frei. Warum?

264

Warum generiert Visual Studio 2005 die .pdbDateien beim Kompilieren in der Version? Ich werde keinen Release-Build debuggen. Warum werden sie generiert?

m.edmondson
quelle
18
Warum pdb in realease generieren? Wenn also ein Absturzbericht aus der Wildnis eingeht, haben Sie Informationen zum Debuggen. Der andere Wert ist, dass Kunden es debuggen können, wenn der ursprüngliche Autor dies nicht tut.
Ian Boyd
@ IanBoyd: Der zweite Satz dieses Kommentars impliziert, dass Sie die PDBs bereitstellen. Dies ist in den allermeisten Fällen nicht wünschenswert.
IInspectable
3
@ IInspectable Oder ist wünschenswert
Ian Boyd
@ IanBoyd: Die überwiegende Mehrheit der Fälle enthält keine Betriebssystembereitstellungen. Außerdem enthalten diese PDBs keine privaten Symbole, die standardmäßig enthalten sind, wenn Sie PDBs generieren.
Unsichtbarer
@IInspectable Auf der anderen Seite, die Freigabe PBDs ist wünschenswert. Im Idealfall würde jeder Code schreiben, der in IL kompiliert wurde, damit wir selbst Symbolinformationen erhalten können. Native Code-Compiler haben jedoch immer noch keine einfache Möglichkeit, das Debuggen vor Ort zu unterstützen.
Ian Boyd

Antworten:

416

Denn ohne die PDB-Dateien wäre es unmöglich, einen "Release" -Build durch etwas anderes als das Debuggen auf Adressenebene zu debuggen. Optimierungen machen wirklich eine Nummer in Ihrem Code, was es sehr schwierig macht, den Schuldigen zu finden, wenn etwas schief geht (z. B. wird eine Ausnahme ausgelöst). Selbst das Setzen von Haltepunkten ist äußerst schwierig, da Quellcodezeilen nicht eins zu eins mit dem generierten Assemblycode (oder sogar in derselben Reihenfolge wie dieser) abgeglichen werden können. PDB-Dateien helfen Ihnen und dem Debugger und erleichtern das Post-Mortem-Debugging erheblich.

Sie weisen darauf hin, dass Sie, wenn Ihre Software zur Veröffentlichung bereit ist, bis dahin alle Fehlerbehebungen durchgeführt haben sollten. Das ist sicherlich richtig, aber es gibt ein paar wichtige Punkte zu beachten:

  1. Sie sollten Ihre Anwendung auch testen und debuggen (bevor Sie sie veröffentlichen), indem Sie den Build "Release" verwenden. Dies liegt daran, dass das Aktivieren von Optimierungen (die in der "Debug" -Konfiguration standardmäßig deaktiviert sind) manchmal zu subtilen Fehlern führen kann, die Sie sonst nicht abfangen würden. Wenn Sie dieses Debugging durchführen, möchten Sie die PDB-Symbole.

  2. Kunden melden häufig Randfälle und Fehler, die nur unter "idealen" Bedingungen auftreten. Dies sind Dinge, die im Labor kaum reproduzierbar sind, da sie auf einer verrückten Konfiguration des Computers dieses Benutzers beruhen. Wenn sie besonders hilfreiche Kunden sind, melden sie die ausgelöste Ausnahme und stellen Ihnen eine Stapelverfolgung zur Verfügung. Oder Sie können sogar ihren Computer ausleihen, um Ihre Software remote zu debuggen. In beiden Fällen möchten Sie, dass die PDB-Dateien Sie unterstützen.

  3. Die Profilerstellung sollte immer bei "Release" -Builds mit aktivierten Optimierungen erfolgen. Und wieder einmal sind die PDB-Dateien nützlich, da sie es ermöglichen, die zu profilierenden Montageanweisungen wieder dem Quellcode zuzuordnen, den Sie tatsächlich geschrieben haben.

Sie können die PDB-Dateien nach dem Kompilieren nicht mehr zurückgeben . * Wenn Sie sie während des Builds nicht erstellen, haben Sie Ihre Chance verloren. Es tut nichts weh, sie zu erschaffen. Wenn Sie sie nicht verteilen möchten, können Sie sie einfach in Ihren Binärdateien weglassen. Aber wenn Sie später entscheiden, dass Sie sie wollen, haben Sie kein Glück. Es ist besser, sie immer zu generieren und eine Kopie zu archivieren, falls Sie sie jemals brauchen.

Wenn Sie sie wirklich ausschalten möchten, ist dies immer eine Option. Setzen Sie im Eigenschaftenfenster Ihres Projekts die Option "Debug Info" für jede Konfiguration, die Sie ändern möchten, auf "none".

Zu beachten ist jedoch, dass die „Debug“ und „Release“ Konfigurationen tun standardmäßig verwenden unterschiedliche Einstellungen für die Debug - Informationen aussendet. Sie möchten diese Einstellung beibehalten. Die Option "Debug Info" ist für einen Debug-Build auf "full" gesetzt. Dies bedeutet, dass zusätzlich zu einer PDB-Datei Debugging-Symbolinformationen in die Assembly eingebettet werden. Sie erhalten auch Symbole, die coole Funktionen wie Bearbeiten und Fortfahren unterstützen. Im Freigabemodus ist die Option "Nur PDF" ausgewählt, die, wie es sich anhört, nur die PDB-Datei enthält, ohne den Inhalt der Assembly zu beeinflussen. Es ist also nicht ganz so einfach wie das bloße Vorhandensein oder Fehlen von PDB-Dateien in Ihrem /binVerzeichnis. Angenommen, Sie verwenden die Option "Nur pdb", die PDB-Datei '

* Wie Marc Sherman in einem Kommentar ausführt , können Sie ihn neu erstellen und eine passende PDB-Datei generieren, solange sich Ihr Quellcode nicht geändert hat (oder Sie den Originalcode von einem Versionskontrollsystem abrufen können). Zumindest normalerweise. Das funktioniert gut , die meiste Zeit, aber der Compiler nicht gewährleistet ist identisch Binärdateien jedes Mal erzeugen Sie den gleichen Code kompilieren , so dass es möglicherweise feine Unterschiede sein. Schlimmer noch, wenn Sie in der Zwischenzeit Upgrades an Ihrer Toolchain vorgenommen haben (z. B. das Anwenden eines Service Packs für Visual Studio), ist die Wahrscheinlichkeit, dass die PDBs übereinstimmen, noch geringer. Um die zuverlässige Erzeugung von Ex-post-Facto zu gewährleistenBei PDB-Dateien müssten Sie nicht nur den Quellcode in Ihrem Versionskontrollsystem archivieren, sondern auch die Binärdateien für Ihre gesamte Build-Toolchain, um sicherzustellen, dass Sie die Konfiguration Ihrer Build-Umgebung präzise neu erstellen können. Es versteht sich von selbst, dass es viel einfacher ist, die PDB-Dateien einfach zu erstellen und zu archivieren.

Cody Grey
quelle
19
"Sie können die PDB-Dateien nach dem Kompilieren nicht generieren." - Wenn sich Ihr Quellcode nicht geändert hat, können Sie ihn neu erstellen, um anschließend einen verwendbaren PDB zu generieren. Standardmäßig lädt windbg diesen PDB nicht, aber Sie können das Laden erzwingen, indem Sie die Option / i wie folgt angeben .reload /i foo.dll. Dadurch wird foo.pdb geladen, auch wenn foo.pdb nach der Veröffentlichung von foo.dll erstellt wurde.
Marc Sherman
Ich habe festgestellt, dass jede neue Kompilierung einen anderen Hash-Digest hat, sodass es bei jedem Build auch in derselben Umgebung geringfügige Abweichungen gibt. Könnten sich die Adressen für die PDBs nicht mit der Varianz ändern, weshalb der PDB von diesem Build ferngehalten werden muss? Ich möchte dies nur als Idee herausstellen, da ich nicht wirklich verstehe, wie PDBs funktionieren oder warum sich die Hashes zwischen Builds ändern.
Thebunnyrules
1
@the In der Fußnote habe ich auf einen Artikel verwiesen, in dem erklärt wird, dass "der C # -Compiler von Haus aus niemals zweimal dieselbe Binärdatei erzeugt. Der C # -Compiler bettet bei jeder Ausführung eine frisch generierte GUID in jede Assembly ein und stellt so sicher, dass keine zwei Assemblys vorhanden sind sind immer Stück für Stück identisch. " Das erklärt, warum es einen anderen Hash und daher eine andere PDB-Datei hat. Dies kann mit einem Hex-Editor behoben werden, ist jedoch nicht benutzerfreundlich. Und auch außerhalb des Rahmens dieser Antwort.
Cody Gray
3
In Roslyn gibt es eine neue Funktion namens deterministische Builds. "Das / deterministische Flag bewirkt, dass der Compiler genau dieselbe EXE / DLL, Byte für Byte, ausgibt, wenn er dieselben Eingaben erhält." Dies bedeutet, dass ein Projekt, das ursprünglich mit diesem Flag kompiliert wurde, in genau dieselbe Binärdatei neu kompiliert werden kann, solange der von Ihnen kompilierte Code identisch ist. Eine längere Erklärung finden Sie bei Deterministic Builds in Roslyn
K Smith
91

PDB kann sowohl für Releaseals auch für generiert werden Debug. Dies ist eingestellt auf (in VS2010, aber in VS2005 muss es ähnlich sein):

Projekt → Eigenschaften → Erstellen → Erweitert → Debug-Informationen

Ändern Sie es einfach in None.

Aliostad
quelle
2
Aber warum würdest du das tun? Wenn Ihre Software zur Veröffentlichung bereit ist, sollten Sie bis dahin Ihr gesamtes Debugging durchgeführt haben
m.edmondson
4
Weil Sie die Produktionsprobleme debuggen können. Einmal mussten wir es tun.
Aliostad
21
Der Vorteil der Überschrift PDBs für Produktionscode besteht darin, dass .NET diese Dateien beim Auslösen von Ausnahmen verwendet. Es werden Stapelspuren mit Dateinamen und Zeilennummern generiert, was oft sehr praktisch ist!
Steven
6
@ m.edmondson: Ja, das ist richtig. Sie werden weiterhin darüber informiert, wie die ausgelöste Ausnahme war (wie FileNotFoundException), aber Sie können keine Stapelverfolgung sehen. Das macht es sehr schwierig , genau zu fassen , welche Zeile von Code der Ausnahme ausgelöst werden , verursacht.
Cody Gray
2
@ m.edmondson Nur um hinzuzufügen, wenn Sie nach einem Tool suchen, mit dem Sie eines der Probleme in Ihren Produktionsboxen remote debuggen können, enthält das Windows SDK ein sehr bekanntes Tool namens WinDbg, das Remote-Debugging unterstützt. Bitte schauen Sie sich den unten genannten Link an. Hoffe das hilft! msdn.microsoft.com/en-in/library/windows/hardware/…
RBT
8

Ohne die .pdb-Dateien ist es praktisch unmöglich, den Produktionscode zu durchlaufen. Sie müssen sich auf andere Tools verlassen, die teuer und zeitaufwändig sein können. Ich verstehe, dass Sie zum Beispiel Tracing oder Windbg verwenden können, aber es hängt wirklich davon ab, was Sie erreichen möchten. In bestimmten Szenarien möchten Sie nur den Remote-Code (keine Fehler oder Ausnahmen) mithilfe der Produktionsdaten durchlaufen, um ein bestimmtes Verhalten zu beobachten. Hier bieten sich PDF-Dateien an. Ohne sie ist es unmöglich, den Debugger für diesen Code auszuführen.

user1714880
quelle
7

Warum sind Sie so sicher, dass Sie Release-Builds nicht debuggen werden? Manchmal (hoffentlich selten, aber passiert) erhalten Sie möglicherweise einen Fehlerbericht von einem Kunden, der aus irgendeinem Grund (unterschiedliche Zeitpunkte, kleines unterschiedliches Verhalten oder was auch immer) in der Debug-Version nicht reproduzierbar ist. Wenn dieses Problem im Release-Build reproduzierbar zu sein scheint, freuen Sie sich über die passende PDF-Datei.

jdehaan
quelle
5
@ m.edmondson Erhalten Sie über RDP, Webex usw. Zugriff auf den Remote-Computer und installieren Sie dort windbg. Richten Sie Ihren Symbolpfad ein und bam, Sie sind golden!
Marc Sherman
Ein Link zu einer detaillierteren Anleitung wäre hilfreicher gewesen. Diese einzeilige Anleitung könnte Menschen (wie mich) auf den falschen Weg führen. Die meisten .NET-Entwickler wissen beispielsweise nichts über Windbg.
Nuzzolilo
1
@ m.edmondson - Einige Editionen von Visual Studio bieten die Möglichkeit, Remote-Debugging durchzuführen. Über das Debug-Menü "An Prozess anhängen" auf dem Remote-Computer.
Matthew
Ist es so eine gute Idee, eine Produktionsanwendungsinstanz remote zu debuggen? Wird die parallele Ausführung von Threads nicht unterbrochen und erzwungen, dass sie beim Debuggen seriell ausgeführt werden?
Kaveh Hadjari
4

Sie können auch Crash-Dumps verwenden, um Ihre Software zu debuggen. Der Kunde sendet es Ihnen und Sie können es verwenden, um die genaue Version Ihrer Quelle zu identifizieren - und Visual Studio ruft mithilfe des Absturzabbausatzes sogar die richtigen Debugging-Symbole (und die Quelle, wenn Sie richtig eingerichtet sind) ab. Weitere Informationen finden Sie in der Microsoft- Dokumentation zu Symbolspeichern .

rlranft
quelle
2

.PDB-Datei ist der Kurzname von "Program Database". Es enthält die Informationen zum Debug-Punkt für den Debugger und die verwendeten Ressourcen oder Referenzen. Es wird generiert, wenn wir als Debug-Modus erstellen. Es ermöglicht der Anwendung, zur Laufzeit zu debuggen.

Die Größe der PDF-Datei wird im Debug-Modus erhöht. Es wird verwendet, wenn wir unsere Anwendung testen.

Guter Artikel der PDF-Datei.

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

Ajay2707
quelle
1
"Diese Datei wird beim Freigeben oder Bereitstellen nicht benötigt", es sei denn, in dieser freigegebenen Version tritt ein Absturz auf, und der Absturzbericht, den Sie von ihm erhalten, enthält keinen verwendbaren Stack-Trace. Dann möchten Sie, dass Sie ihn später einfügen alles.
Nyerguds
Nicht wahr. Ohne .pdb-Dateien erhalten Sie eine vollständige Stapelverfolgung, jedoch ohne Namen der Quelldateien. Sie können es intern wiederherstellen, nachdem Sie einen Absturzbericht erhalten haben. Wenn Sie sich um Ihre geistigen Rechte kümmern und Quellen verschleiern, müssen Sie PDF-Dateien speichern, aber nicht bereitstellen.
TOP KEK
1

In einer Multiprojektlösung möchten Sie normalerweise eine Konfiguration haben, die überhaupt keine PDB- oder XML-Dateien generiert. Anstatt die Debug InfoEigenschaft jedes Projekts in zu ändern none, hielt ich es für zweckmäßiger, ein Post-Build-Ereignis hinzuzufügen, das nur in einer bestimmten Konfiguration funktioniert.

Leider können Sie in Visual Studio keine unterschiedlichen Post-Build-Ereignisse für unterschiedliche Konfigurationen angeben. Deshalb habe ich mich dazu entschlossen, die csprojDatei des Startprojekts zu bearbeiten und Folgendes hinzuzufügen (anstelle eines vorhandenen PostBuildEventTags):

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

Leider wird dadurch das Textfeld für das Ereignis nach dem Erstellen leer, und das Einfügen von Daten kann zu unvorhersehbaren Ergebnissen führen.

GregRos
quelle
4
Dadurch werden ALLE *.xmlDateien gelöscht. Seien Sie vorsichtig damit.
Mariusz Jamro
0

Debug-Symbole ( .pdb) und XML-Dokumentdateien ( .xml) machen einen großen Prozentsatz der Gesamtgröße aus und sollten nicht Teil des regulären Bereitstellungspakets sein. Es sollte jedoch möglich sein, auf sie zuzugreifen, falls sie benötigt werden.

Ein möglicher Ansatz: Verschieben Sie sie am Ende des TFS-Erstellungsprozesses in ein separates Artefakt.

Mark Johanes
quelle
-1

Ohne PDB-Dateien und symbolische Informationen wäre es unmöglich, einen erfolgreichen Absturzbericht (Speicherauszugsdateien) zu erstellen, und Microsoft hätte nicht das vollständige Bild, das das Problem verursacht hat.

Mit PDB wird die Crash-Berichterstattung verbessert.

Prosti
quelle
Aber was genau fehlt ohne .pdb-Dateien?
TOP KEK
Sie können die PDB-Dateien nach dem Kompilieren nicht generieren. Daher sollte jede Version der Software major.minor [.build [.revision]] bei Microsoft gespeichert worden sein, um richtig zu verstehen, was passiert ist, aber das ist noch nicht alles.
Prosti
Es wird nicht garantiert, dass der Compiler jedes Mal, wenn Sie denselben Code kompilieren, identische Binärdateien generiert.
Prosti
Die Frage war, was in Absturzberichten fehlen wird und wie sich die Absturzberichte auswirken werden. .NET-PDF-Dateien enthalten nur private Variablennamen und Quelldateinamen. Alles andere (Methodennamen, Signaturen usw.) wird aus Metadateninformationen im Stacktrace erstellt.
TOP KEK
Keine PDB-Dateien enthalten auch nicht private Daten: github.com/microsoft/microsoft-pdb .
Prosti