Symbole

Symbole sind hilfreich beim Debuggen und bei anderen Diagnosetools. Der Inhalt von Symboldateien ist abhängig von Sprachen, Compilern und Plattformen. Symbole sind im Grunde genommen eine Zuordnung zwischen dem Quellcode und der vom Compiler erzeugten Binärdatei. Diese Zuordnungen werden von Tools wie Visual Studio und Visual Studio Code verwendet, um Informationen zu Quellzeilennummern oder Namen lokaler Variablen aufzulösen.

Die Windows-Dokumentation zu Symbolen enthält genauere Informationen zu Symbolen für Windows, wobei viele der Konzepte auch auf andere Plattformen angewendet werden können.

Informationen über das portierbare PDB-Format von .NET

.NET Core hat ein neues Dateiformat (PDB) für Symbole eingeführt: die portierbare PDB-Datei. Im Gegensatz zu herkömmlichen PDB-Dateien, die nur unter Windows unterstützt werden, können portierbare PDB-Dateien auf allen Plattformen erstellt und gelesen werden.

Was ist eine PDB-Datei?

Eine PDB-Datei ist eine Hilfsdatei, die von einem Compiler generiert wird, um anderen Tools, insbesondere Debuggern, Informationen zum Inhalt der ausführbaren Hauptdatei und der Erstellung dieses Inhalts zu geben. Ein Debugger liest eine PDB-Datei beispielsweise, um die foo.cs-Zeile 12 dem richtigen ausführbaren Speicherort zuzuordnen, sodass ein Breakpoint gesetzt werden kann. Das PDB-Format von Windows gibt es schon lange, und es wurde auf Basis anderer, noch älterer nativer Formate für Debugsymbole entwickelt. Zu Beginn war es ein Format für native Programme (C/C++). Beim ersten Release des .NET Framework wurde das PDB-Format von Windows erweitert, sodass es .NET unterstützt.

Das portierbare PDB-Format wurde in .NET Core eingeführt und wird standardmäßig verwendet, wenn .NET als Ziel festgelegt ist. Wenn Sie auf .NET Framework abzielen, können Sie portierbare PDB-Symbole aktivieren, indem Sie <DebugType>portable</DebugType> in Ihrer Projektdatei angeben. Das portierbare PDB-Format basiert auf dem Metadatenformat ECMA-335. Weitere Informationen finden Sie unter Portierbares PDB v1.0: Formatspezifikation. Diagnosetools können die System.Reflection.Metadata-Bibliothek verwenden, um portierbare PDB-Dateien zu lesen (ein Beispiel finden Sie unter System.Reflection.Metadata.Document).

Verwenden des richtigen PDB-Formats für Ihr Szenario

Weder portierbare PDBs noch Windows-PDBs werden überall unterstützt. Um zu entscheiden, welches Format verwendet werden sollte, überlegen Sie, wo Ihr Projekt verwendet wird und wo das Debugging für das Projekt ausgeführt wird. Wenn Ihr Projekt in beiden Formaten verwendet und debuggt werden soll, können Sie verschiedene Buildkonfigurationen verwenden und das Projekt zweimal erstellen, um beide Szenarios zu unterstützen.

Unterstützung für portable PDB-Dateien

Eine portierbare PDB kann unter jedem Betriebssystem gelesen werden und ist das empfohlene Symbolformat für verwalteten Code. Es gibt jedoch eine Reihe von Legacytools und -anwendungen, in denen sie nicht unterstützt werden:

  • Anwendungen für .NET Framework 4.7.1 oder früher: Ausgeben von Stapelüberwachungen mit Zuordnungen zurück zu Zeilennummern (wie bei einer ASP.NET-Fehlerseite). Der Name von Methoden ist davon nicht betroffen. Nur die Namen von Quelldateien und Zeilennummern werden nicht unterstützt.

  • Wenn Sie .NET-Decompiler wie ildasm oder .NET Reflector verwenden, werden Quellzeilenzuordnungen oder lokale Parameternamen nicht angezeigt.

  • Die neuesten Versionen von DIA und Tools, die DIA zum Lesen von Symbolen verwenden, z. B. WinDBG, unterstützen portierbare PDB-Dateien, frühere Versionen aber nicht.

  • In einigen früheren Profiler-Versionen werden portierbare PDB-Dateien möglicherweise nicht unterstützt.

Wenn Sie portierbare PDB-Dateien in Tools verwenden möchten, die diese nicht unterstützen, können Sie Pdb2Pdb verwenden, mit dem portierbare PDB-Dateien in Windows-PDB-Dateien konvertiert werden und umgekehrt.

Unterstützung für Windows-PDB-Dateien

Windows-PDB-Dateien können nur unter Windows geschrieben oder gelesen werden. Windows-PDB-Dateien werden nicht mehr für verwalteten Code verwendet. Dies ist nur bei Legacytools nötig. Es wird empfohlen, portierbare PDB-Dateien statt Windows-PDB-Dateien zu verwenden, da einige neuere Compilerfunktionen nur für portierbare PDB-Dateien implementiert werden.

Weitere Informationen