So debuggen Sie eine referenzierte DLL (mit pdb)

132

Ich habe zwei Lösungen in meinem Arbeitsbereich, z. B. 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 eintreten 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 hilfreich ist.

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

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

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


Lösung: Mein Fehler war, dass ich dachte, dass ein Projekt nur Teil einer einzigen Lösung sein kann. Tatsächlich kann ein Projekt Teil einer beliebigen Anzahl von Lösungen sein.
Wenn Sie auf das alte Projekt verweisen müssen, sollten Sie das Projekt einfach zur Lösung hinzufügen. 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 wahrscheinlich die Verwendung von DLL-Verweisen auf Ihren eigenen Code (oder anderen Code, den Sie möglicherweise ändern und debuggen müssen) vollständig vermeiden.

Eine sehr gute Referenz zum Entwerfen von Lösungen finden Sie in MSDN .

Elad
quelle
Diese MSDN-Verbindung ist ein Muss für .net-Entwickler (unabhängig von der verwendeten Quellcodeverwaltung). Ich bin überrascht, dass ich es vorher nicht gesehen hatte. Vielen Dank!
Pat
Neulinge, wenn Sie bereits über Projektreferenzen Bescheid wissen und dies keine Option ist (z. B. müssen Sie ein NuGet-Paket debuggen), ignorieren Sie die akzeptierte Antwort und gehen Sie direkt zu dieser: stackoverflow.com/a/26029208/398630
BrainSlugs83

Antworten:

113

Wenn Sie eine Projektreferenz haben , sollte diese sofort funktionieren.

Wenn es sich um eine Datei (DLL) Referenz, müssen Sie die Debug - Symbole (die „PDB“ Datei) im selben Ordner wie die dll sein. Überprüfen Sie, ob Ihre Projekte Debug-Symbole generieren (Projekteigenschaften => Build => Erweitert => Ausgabe / Debug-Info = voll). und wenn Sie die DLL kopiert haben , legen Sie die pdb damit.

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

Am einfachsten ist es, Projektreferenzen zu verwenden!

Marc Gravell
quelle
3
Leider denke ich, dass es nicht möglich ist, Projektreferenzen zu Projekten aus einer anderen Lösung hinzuzufügen (korrigieren Sie mich, wenn ich falsch liege!).
Elad
7
@Elad Ich habe das gerade gemacht. Fügen Sie zuerst "vorhandenes Projekt" zur Lösung hinzu. Fügen Sie dann eine Referenz zum Projekt hinzu, indem Sie auf Projektreferenz hinzufügen klicken. Sie können die Haltepunkte in den vorhandenen Projektdateien festlegen. Das ist schön, weil die Dateien nicht kopiert werden.
user420667
3
Ich habe DLL-Projekt als Projektreferenz, aber Haltepunkte innerhalb werden ignoriert.
Slawischer
1
Ich konnte heute tatsächlich eine (Release-) Assembly debuggen, die als Dateireferenz hinzugefügt wurde. Gut für mich, aber wie ist das passiert? MSVC2010, C #, (ASP) .NET 4.0, referenzierte Assembly existiert als Debug + Release (aber nur Release-Datei zum Projekt hinzugefügt). Möchte das wirklich klarstellen.
Tobias81
1
Für mich funktionierte es an einem Tag, aber am nächsten Tag funktionierte es nicht (mit DLLs und PDB-Dateien). Durch Drücken der Schaltfläche "Leerer Symbolcache" unter Extras> Optionen> Debuggen> Symbole wurde dies jedoch behoben.
Paul
45

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

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

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

3) Löschen Sie unter Extras / Optionen> Debuggen> Symbole alle zwischengespeicherten Symbole, deaktivieren und löschen Sie alle Ordnerpositionen im Listenfeld "Speicherorte der Symboldatei (.pdb)" mit Ausnahme des Standardfelds "Microsoft Symbol Server", deaktivieren Sie sie jedoch weiterhin. Löschen Sie auch alle statischen Pfade im Textfeld "Cache-Symbole in diesem Verzeichnis". Klicken Sie auf die Schaltfläche "Cache für leere Symbole". Stellen Sie schließlich sicher, dass das Optionsfeld "Nur angegebene Module" aktiviert ist.

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

scott_f
quelle
3
Mein Problem war, dass meine beiden Projekte unterschiedliche .Net Frameworks verwendeten: 4.0 und 4.5. Tx!
user627283
1) und 4) sind entscheidend. Vergessen Sie nicht, im Debug-Modus zu erstellen und dasselbe Framework zu verwenden.
Scott_f
12

Beachten Sie auch, dass die referenzierten DLLs nicht im 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 auf die Assemblys zugreifen, auf die verwiesen wurde, bis ich sie aus dem GAC gelöscht hatte.

KevinHou
quelle
2
DANKE! Das war mein Problem. Ich kann nicht glauben, dass ich das nicht herausgefunden habe: - / Ich dachte, das Festlegen der Projektreferenz würde irgendwie überschreiben, was im GAC installiert wurde.
SnookerC
Absolut! Dies ist ein sehr guter Punkt. Selbst wenn Sie dieselbe Version von .NET Framework haben, wird beim Debuggen von Code im GAC kein Haltepunkt erreicht, wenn sich die .PDB-Datei im GAC von der in Ihrem Projektordner unterscheidet. Eine Lösung hierfür besteht darin, die DLL zu deaktivieren, die Assembly zu erstellen und anschließend erneut zu gacen.
DigiOz Multimedia
7

Schritt 1: Gehen Sie zu Extras -> Option -> Debuggen

Schritt 2: Deaktivieren Sie Nur meinen Code aktivieren

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

Schritt 4: Deaktivieren Sie Schritt über Eigenschaften und Operatoren

Arindam Dhar
quelle
3

Ich hatte die *.pdbDateien im selben Ordner und verwendete die Optionen von Arindam , aber es funktionierte immer noch nicht. Es stellte sich heraus, dass ich das Debuggen von nativem Code aktivieren musste , das unter Projekteigenschaften> Debuggen zu finden ist .

Roald
quelle
1
Diese Informationen sollten in der akzeptierten Antwort enthalten sein. Es ist das, wonach ich speziell gesucht habe. danke für das Teilen! +1
Heriberto Lugo
2

Wenn Sie einen Haltepunkt im Quellcode einer referenzierten DLL festlegen möchten, stellen Sie zunächst sicher, dass eine PDF-Datei dafür verfügbar ist. 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 unter Wie kann ich in Visual Studio einen Haltepunkt in referenziertem Code festlegen?

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

Dieser Ansatz hat den Vorteil, dass Sie Ihrer Lösung kein vorhandenes Projekt nur zu Debugging-Zwecken hinzufügen müssen, da ich durch das Weglassen viel Zeit beim Erstellen gespart habe. Offensichtlich ist das Erstellen einer Lösung mit nur einem Projekt viel schneller als das Erstellen einer Lösung mit vielen davon.

Carl in 't Veld
quelle
1
Dies funktioniert nur, wenn die externe Datei, in der Sie den Haltepunkt platziert haben, mit dem genauen Pfad im PDB übereinstimmt. (ZB funktioniert nur, wenn Sie die DLL auf Ihrem Computer erstellt haben.)
Josh M.
2

Stellen Sie sicher, dass Ihre DLL nicht im GAC registriert ist. Visual Studio verwendet die Version im GAC und enthält wahrscheinlich keine Debugging-Informationen.

Guillermo Prandi
quelle
1

Ich möchte kein externes Klassenbibliotheksprojekt in einige meiner Lösungen aufnehmen, daher gehe ich in Assemblys, die ich auf andere Weise verwende.

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

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

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

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

Jeff LaFay
quelle
0

Es muss funktionieren. Ich habe gleichzeitig eine EXE-Datei und eine DLL debuggt! Was ich vorschlage, ist 1) Fügen Sie den Pfad der DLL in Ihr B-Projekt ein, 2) Kompilieren Sie dann beim Debuggen Ihres A-Projekts 3) Kontrollieren Sie, dass der Pfad auf die A-DLL- und De-PDF-Datei zeigt .... 4) Danach Sie Starten Sie das Debuggen des B-Projekts und wenn alles in Ordnung ist, können Sie in beiden Projekten debuggen!

Matthieu
quelle
0

Die einfachste Möglichkeit, mit VisualStudio 2019 eine externe Bibliothek zu debuggen, auf die Sie in NuGet verweisen, besteht darin, die folgenden Schritte auszuführen:

  1. Extras> Optionen> Debuggen> Allgemein> Deaktivieren Sie "Nur meinen Code aktivieren".

  2. Gehen Sie zu Assembly Explorer> Aus NuGet Packages Cache öffnen Listenpunkt

  3. Geben Sie den Namen des NuGet-Pakets, das Sie debuggen möchten, in das Suchfeld ein und klicken Sie auf "OK". Geben Sie hier die Bildbeschreibung ein

  4. Klicken Sie im Assembly Explorer mit der rechten Maustaste auf die importierte Assembly und wählen Sie "Pdb generieren". Geben Sie hier die Bildbeschreibung ein

  5. Wählen Sie einen benutzerdefinierten Pfad aus, in dem Sie die PDF-Datei und das Framework speichern möchten, für das dies generiert werden soll

    Geben Sie hier die Bildbeschreibung ein

  6. Kopieren Sie die PDF-Datei aus dem generierten Ordner in Ihren Debug-Ordner, und Sie können jetzt Haltepunkte für den Bibliothekscode dieser Assembly festlegen

magicode118
quelle
Hört sich gut an, außer dass ich keinen Assembly Explorer finde. Ist das nicht ein Teil von Resharper?
Robert Massa