Ich gehe durch den WPF-Quellcode, um ein Problem mit meinem eigenen Code zu beheben. Ich habe die Quelle und die PDBs (ich benutze dotpeek als Symbol-Server, so dass ich die volle pdbs mit Quellcode habe) und ich kann in den WPF-Code kein Problem treten. Die Module, die mich interessieren, sind PresentationFramework und System.Xaml. Die Debugging-Erfahrung ist schrecklich, weil die Framework-Module optimiert sind (normalerweise eine gute Sache!).
Mein (sehr vauge) Verständnis ist, dass sie mit ngen.exe von VS oder was auch immer vorinstalliert sind, bei der Installation ... und dies verursacht die Verschleierung.
Wie ich es verstehe, kann ich ngen.exe (von der Developer Command Prompt aus dem Visual Studio-Ordner gestartet) verwenden, um die nativen Image-Dateien zu deinstallieren. Zum Beispiel ...
%Vor% Ich bin der Ansicht, dass dies den C # -Compiler dazu zwingt, zu den MSIL-Versionen zurückzukehren und JIT zur Laufzeit zu kompilieren. Ich gehe auch davon aus, dass ich dann die Laufzeit-JIT-Optimierung deaktivieren kann und so eine anständige Debug-Erfahrung bekomme.
Die Deinstallation der nativen Zielbilder erweist sich jedoch als problematisch. Ngen macht es aber, es hat keine Auswirkungen, soweit die Debugging-Erfahrung betroffen ist.
Wenn ich versuche, die gleichen Module wieder zu deinstallieren, werde ich informiert, dass sie nicht installiert sind - was ermutigend ist - aber ich bekomme auch eine Liste von Dateien, die davon abhängen, eine Menge DLL- und EXE-Dateien und auch einige native Bilddateien (etwa zehn davon) und die folgende Nachricht ...
%Vor%Also, ich nehme an, dass ich die Wurzeln für diese zehn Dateien finden muss und alles von dort zu deinstallieren habe. Dies könnte ziemlich schnell außer Kontrolle geraten, wenn es eine Menge an Abhängigkeiten gibt.
Angenommen, ich kann unoptimierte Module erhalten, um die JIT-Optimierung zu unterdrücken, habe ich ini-Dateien zum selben Ordner hinzugefügt wie die Module, die ich durchgehen möchte, zum Beispiel in C:\Windows\Microsoft.NET\assembly\GAC_MSIL\PresentationFramework\v4.0_4.0.0.0__31bf3856ad364e35
Ich habe
PresentationFramework.ini
%Vor%Unter Extras / Optionen / Debugging / Allgemein / Ich habe die Unterstützung für Quellserver deaktiviert und JIT-Optimierung beim Laden von Modulen aktiviert aktiviert.
In den Projektoptionen habe ich den Optimize-Code im Build-Bereich deaktiviert. Außerdem habe ich Debugging-Informationen in Build / Advanced auf Full gesetzt.
Bin ich auf dem richtigen Weg? Gibt es eine Konfigurationsoption irgendwo in VS, wo ich es nur sagen kann, um die DLL-Dateien zu verwenden und die aggressiv optimierten nativen Bilder zu ignorieren?
Dank Hilfe von @HansPassant habe ich es endlich herausgefunden.
Die nativen Bilddateien werden in C: \ Windows \ assembly \ gespeichert, aber es gibt eine Windows-Erweiterung namens shfusion.exe, die den normalen Zugriff auf diesen Ordner verhindert. Dies wird behoben, indem der folgende Befehl von einem erhöhten cmd-Fenster ausgeführt wird ...
%Vor%Dann können Sie die von Hans beschriebenen Inhalte sehen ...
Als Nächstes habe ich genau bestätigt, welche Versionen der systemeigenen Images von Visual Studio verwendet wurden, indem ich das Kontextmenü "Process Hacker / Properties" verwendete, um die vom devenv-Prozess verwendeten .NET-Assemblys auszuprobieren. Es hat eine "Pfad" und eine "Native Image Path" -Spalte, so dass ich genau sehen konnte, welche NIs von VS verwendet wurden. Dann habe ich die Ordner der Module umbenannt, die ich nicht optimieren möchte ...
Stellen Sie sicher, dass ich die richtigen Einstellungen in VS-Optionen / Debugging, einschließlich JIT-Optimierung unterdrücken ... habe
Beachten Sie, dass Sie das Kontrollkästchen JIT-Optimierung unterdrücken nicht aktivieren müssen, wenn Sie die ini-Dateien hinzufügen, wie in meiner Frage in Deaktivieren der JIT-Optimierung bestimmter MSIL-Module beschrieben.
Und die Debug-Probleme mit Objekten, die weg optimiert und Zeilen übersprungen wurden, wurden behoben.
Wie in dieser Antwort erläutert, kann ich Ausdrücke wie diese in die Haltepunkt-Aktion einfügen und sie wird jedes Mal funktionieren ...
Wenn Sie das Framework "debuggen" wollen, deaktivieren Sie JIT nicht, was Sie brauchen.
Laut diesem Blog
Alle PDBs, die auf dem Microsoft Symbol Server vorhanden sind, enthalten keine Quellinformationen, wodurch sie für das Durchlaufen von Quellen nicht sehr nützlich sind.
Beginnend mit .NET 4.5.1 wird der Symbolindexierungs- und Veröffentlichungsprozess so geändert, dass er mit dem Erstellungsprozess synchron ist, wenn die Updates ausgeliefert werden. Die entsprechenden PDBs werden ebenfalls entsprechend auf den Referenzquellenstandort aktualisiert.
Sie sollten daher den Microsoft Symbol Server deaktivieren und ändern, um die neue Referenz-Quellsite zu verwenden: Ссылка
Bitte folgen Sie den Schritten:
1). Deaktivieren Sie die Microsoft Symbol Server-Suche über Extras | Optionen | Debuggen | Symbole. Stellen Sie sicher, dass das Kontrollkästchen vor Microsoft Symbol Server deaktiviert ist.
2). Ändern Sie den Speicherort der Symboldatei in Ссылка
3). Konfigurieren Sie die .NET-Referenzquelle für das Debugging: Ссылка
Weitere Informationen finden Sie in dem oben angegebenen Blog: Ссылка
Danke.
Quelle: Ссылка
Tags und Links c# .net-4.0 compiler-optimization windows-10 visual-studio-2015