web-dev-qa-db-ger.com

Debuggen einer referenzierten DLL (mit pdb)

Meine Frage bezieht sich auf Visual Studio 2008, obwohl ich vermute, dass es in VS2005 genauso sein sollte 

Ich habe zwei Lösungen in meinem Arbeitsbereich, sagen Sie A und B.

Lösung A ist ein älteres Projekt, das ich vor einiger Zeit fertig codiert habe ..__ In Lösung B muss ich einige Klassen aus Lösung A verwenden. Dazu füge ich einen Verweis auf die DLL eines der Projekte in Lösung A hinzu .

Das Problem ist, wenn ich versuche zu debuggen. Ich möchte auch in den Code von A einsteigen können. Visual Studio kann den Code für diese Klassen nicht laden ("Für den aktuellen Speicherort ist kein Quellcode verfügbar".) Und ich kann nur die Demontage anzeigen, was nicht nützlich ist.

Die einzige Möglichkeit, Klassen von Lösung A zu debuggen, besteht darin, Lösung B auszuführen, alle Prozesse zu trennen (im Menüelement Debug) und den Prozess aus Lösung A anzuhängen.

Dies ist jedoch sehr unpraktisch und ich kann nur A OR B auf einmal debuggen.

Gibt es eine Möglichkeit, in den Code der referenzierten DLLs (für die ich den Quellcode habe) zu gelangen?


Lösung: Mein Fehler war, dass ich dachte, dass ein Projekt nur Teil einer einzigen Lösung sein kann. In der Tat kann ein Projekt Teil einer beliebigen Anzahl von Lösungen sein.
Wenn Sie das alte Projekt referenzieren müssen, fügen Sie das Projekt einfach zur Lösung hinzu. Klicken Sie dazu mit der rechten Maustaste auf die neue Lösung im Projektmappen-Explorer> Hinzufügen> Vorhandenes Projekt.
Anschließend können Sie die Projektreferenz hinzufügen. Wie andere geschrieben haben, sollten Sie die Verwendung von DLL-Verweisen auf Ihren eigenen Code (oder anderen Code, den Sie möglicherweise ändern und debuggen müssen) wahrscheinlich vollständig vermeiden.

Eine sehr gute Referenz, wie Lösungen entworfen werden sollten, kann in MSDN gefunden werden.

107
Elad

Wenn Sie eineProjektReferenz haben, sollte es sofort funktionieren.

Wenn es sich um eine Referenz von file (dll) handelt, müssen die Debugging-Symbole (die "pdb" -Datei) im selben Ordner wie die dll sein. Überprüfen Sie, ob Ihre Projekte Debug-Symbole generieren (Projekteigenschaften => Build => Advanced => Output/Debug Info = full); und wenn Sie kopiert die dll haben, setzen Sie die pdb mit.

Sie können Symbole auch direkt in IDE laden, wenn Sie keine Dateien kopieren möchten, aber es ist mehr Arbeit.

Die einfachste Möglichkeit ist die Verwendung von Projektreferenzen!

92
Marc Gravell

Ich hatte das gleiche Problem. Er ist was ich gefunden habe:

1) Stellen Sie sicher, dass alle Projekte dasselbe Framework verwenden (dies ist entscheidend!).

2) Stellen Sie unter Tools/Optionen> Debugging> Allgemein sicher, dass "Nur meinen Code aktivieren (nur verwaltet)" aktiviert ist

3) Deaktivieren Sie unter Extras/Optionen> Debugging> Symbole alle zwischengespeicherten Symbole. Deaktivieren und löschen Sie alle Ordnerpositionen unter dem Listenfeld "Symboldatei (.pdb)" mit Ausnahme der Standardeinstellung "Microsoft Symbol Servers". Löschen Sie außerdem statische Pfade im Textfeld "Cache-Symbole in diesem Verzeichnis". Klicken Sie auf die Schaltfläche "Symbols Cache leeren". Stellen Sie abschließend sicher, dass das Optionsfeld "Nur angegebene Module" aktiviert ist.

4) Stellen Sie im Build/Configuration Manager-Menü für alle Projekte sicher, dass sich die Konfiguration im Debug-Modus befindet.

37
scott_f

Beachten Sie auch, dass die referenzierten DLLs nicht in der GAC installiert sind. Nach dem Testen habe ich meine DLLs im GAC installiert, um Tests auf Systemebene durchzuführen. Später, als ich meinen Code erneut debuggen musste, konnte ich nicht in die referenzierten Assemblys einsteigen, bis ich sie aus dem GAC löschte.

9
KevinHou

Wenn Sie einen Haltepunkt im Quellcode einer referenzierten DLL festlegen möchten, müssen Sie zunächst sicherstellen, dass Sie eine pdb-Datei für sie haben. Dann können Sie einfach die zugehörige Quellcodedatei öffnen und dort einen Haltepunkt setzen. Die Quelldatei muss nicht Teil Ihrer Lösung sein. Wie in Wie kann ich einen Haltepunkt in referenziertem Code in Visual Studio festlegen?

Sie können Ihre Haltepunkte über das Haltepunktfenster überprüfen, das über Debug -> Windows -> Haltepunkte verfügbar ist.

Dieser Ansatz hat den Vorteil, dass Sie nicht nur zu Debugging-Zwecken ein vorhandenes Projekt zu Ihrer Lösung hinzufügen müssen. Offensichtlich ist das Erstellen einer Lösung mit nur einem Projekt viel schneller als das Erstellen einer Lösung mit vielen.

2
Carl in 't Veld

Schritt 1: Gehe zu Tools -> Option -> Debugging  

Schritt 2: Deaktivieren Sie die Option Nur meinen Code aktivieren

Schritt 3: Deaktivieren Sie die Option Quelldatei muss mit der Originalversion übereinstimmen

Schritt 4: Deaktivieren Sie Schritt über Eigenschaften und Operatoren

2
Arindam Dhar

Ich hatte die *.pdb-Dateien im selben Ordner und verwendete die Optionen von Arindam , aber es funktionierte immer noch nicht. Es stellte sich heraus, dass ich Native Code-Debugging aktivieren aktivieren musste. Dieses kann unter Projekteigenschaften> Debug gefunden werden.

0
Roald

Es muss funktionieren. Ich habe eine .exe-Datei und eine DLL gleichzeitig debuggt! Was ich vorschlage, ist 1) Fügen Sie den Pfad der DLL in Ihr B-Projekt ein, .__ Projekt 3) Legen Sie fest, dass der Pfad auf die DLL-Datei und die Pdb-Datei .....__ zeigt. 4) Danach starten Sie das Debuggen des B-Projekts. Wenn alles in Ordnung ist, können Sie das Debugging durchführen beide projekte!

0
Matthieu

Ich möchte nicht ein externes Klassenbibliothekprojekt in einige meiner Lösungen einschließen, also gehe ich in Assemblies, die ich auf andere Weise verbrauche. 

Meine Lösungen haben ein "Common Assemblies" -Verzeichnis, das meine eigenen DLLs aus anderen Projekten enthält. Die DLLs, auf die ich mich beziehe, haben auch die zugehörigen PDB-Dateien zum Debuggen.

Zum Debuggen und Festlegen von Haltepunkten setze ich einen Haltepunkt in der Quelle der konsumierenden Anwendung, in dem ich eine Methode oder einen Konstruktor aus der Assembly aufrufe, und dann den Methoden-/Konstruktoraufruf INTO (F11).

Der Debugger lädt die Quelldatei der Assembly in VS und neue Haltepunkte innerhalb der Assembly können an diesem Punkt festgelegt werden.

Dies ist nicht einfach, aber es funktioniert, wenn Sie keine neue Projektreferenz einfügen möchten und stattdessen einfach auf eine freigegebene Assembly verweisen möchten.

0
jlafay