2014-11-27 5 views
9

Ich versuche, eine C# -Dll aus einer nativen C++ - Programmdatei zu debuggen. Ich habe ein C# COM-Objekt, das über IDispatch geladen und aus systemeigenem Code ausgeführt wird. Alles ist in Debug eingebaut, sowohl C# als auch C++ Code. Während ich den ganzen C++ - Code sehen kann und alle C++ - DLLs ihre Symbole geladen haben und zum Debuggen verfügbar sind, bricht der C# -Code ab."übersprungen Laden Symbole für Ngen-Binärdatei" für C# dll

Was ich sehe, ist, dass die C# dlls alle lehnen ihre Symbol pdbs laden, Berichterstattung "übersprungen Laden Symbole für Ngen binär" im Modulfenster.

Übrigens bin ich Debuggen der C# -Lösung hier, ich habe die native ausführbare Datei als 'Start externes Programm' in den Debug-Einstellungen des COM-Projekts festgelegt.

Jetzt kann ich die ausführbare C++ starten und dann anhängen, und dann funktioniert alles wie ich erwarte - die Symbole laden und ich kann Haltepunkte in der C# setzen.

Dies verwendet Visual Studio 2013u4. Gibt es eine Einstellung, um Debugging im gemischten Modus zu aktivieren? Ein Nachteil ist, dass der native Code mit VS2010 erstellt wurde.


Modules output when debugging external process

Hier ist das Modul-Fenster - alle PDBS beachten und DLLs werden in einem einzigen Verzeichnis, können Sie die C++ DLLs geladen, aber nicht die C# Einsen.

Modules output after attach to process

Hier ist der Module Fenster - beachten Sie den dritten Eintrag für die eVCOM dll (das COM-Objekt), die ich nehme an der Eintrag Debugging ermöglicht.

Es gibt nichts von Interesse in der Ausgabe Fenster, wenn es zum Laden der COM-DLL kommt, sehe ich Folgendes (im Fall der Anfügen an den laufenden Prozess, der andere hat nur 2 Loaded Linien statt 3).

'Explorer.exe' (Win32): Loaded 'C:\Dev\...\lib\debug\EvCom.dll'. 
'Explorer.exe' (Win32): Loaded 'C:\Dev\...\lib\debug\EvCom.dll'. 
'Explorer.exe' (Win32): Unloaded 'C:\...\lib\debug\EvCom.dll' 
'Explorer.exe' (Win32): Loaded 'C:\Dev\...\lib\debug\EvCom.dll'. 

Eine Sache von Interesse - Ich habe den „Use Managed-Kompatibilitätsmodus“ in den Debug-Einstellungen und dachte, dass es immer noch nicht meine Symbole nicht geladen werden, wenn das Debuggen starten, es zeigt nur 1 Eintrag in der Liste Module. Dieses Mal sagt "Keine nativen Symbole in der Symboldatei" für die C# dlls.

Es scheint, als ob das Problem nicht in der Lage ist, den Debugger-Typ in VS2013 (oder 2012) auszuwählen. This connect article schlägt seine "mit Absicht" mit einigen Problemumgehungen vor.

+4

Rechtsklick auf Ihr C++ Projekt, Eigenschaften, Debugging, Debugger Type = Mixed. –

+0

Es gibt kein C++ - Projekt, ich debugge mein C# -Projekt in VS2013, und es gibt keine solche Einstellung dort, das native Projekt wird extern erstellt und nicht innerhalb VS als Projekt referenziert. – gbjbaanb

+0

"Ich kann den ganzen C++ Code sehen" ist ... seltsam dann. Sie müssen bereits Debugging im gemischten Modus aktiviert haben, nur um C++ - Code zu sehen. Konzentriere dich auf die seltsame Warnung vor ngen Binärdateien, das ist nicht normal. Du solltest niemals Code debuggen. Führen Sie ngen/uninstall aus, um es zu entfernen. –

Antwort

7

Stellt sich heraus, es ist alles bis auf die Veränderungen in der Debug-Engine für .NET 4.0

.NET 4 und höher verwendet einen anderen Debug Engine als .net 3.5 und unten, wenn Sie den Debugger Debuggen einer nativen Anwendung starten wird einen .net Debugger für Sie wählen (standardmäßig auf .net 4.0) und wenn Ihre .net dll mit dieser Plattform gebaut wird, wird alles gut - Breakpoints werden getroffen.

Wenn Ihre geladene DLL .NET 3.5 ist, dann wird die Debug-Engine die DLLs, die geladen werden, nicht verstehen und wird es ablehnen, Symbole zu laden oder zu debuggen.

Die Lösungen sind entweder als .net 4 neu zu erstellen, oder starten Sie die native ausführbare Datei und anhängen (wo Sie den Debugger-Typ auswählen können, entweder 'alt' .net oder 'neu' .net) oder Sie können erstellen ein Projekt aus der ausführbaren Datei und legen Sie seine Debug-Einstellungen fest, um den richtigen Debugger anzugeben.

Was ich nervig finde, ist, dass Microsoft den Debugger leicht mit dem .NET-Framework-Typ in dem zu debuggenden Projekt gestartet hätte (beim Debuggen einer DLL und Angeben eines externen Programms wollen Sie immer noch debuggen) die DLL drücken Sie F5 für, so dass Sie wissen, was Debugger zu verwenden!) (Was ist noch ärgerlicher ist, dass wenn einmal Debugging in einer geladenen DLL gestartet wird, können Sie dann in Projekte mit älteren .net-Frameworks problemlos).

Mehr Details zu this Microsoft connect Artikel

1

(Wenn die ausführbare Datei nicht bereits in Ihrer Lösung ist, Datei> Hinzufügen> Projekt vorhanden, dann mit der rechten Maustaste und legen Sie es als Start-up-Projekt.)

Klicken Sie mit der rechten Maustaste auf Ihr Startprojekt, Eigenschaften, Debuggen, Debugger-Typ = Gemischt.

+0

hast du mehr gelesen als Hans Passants Kommentar? Überprüfen Sie die akzeptierte Antwort auf Gründe, warum Ihre Antwort nicht korrekt ist. – gbjbaanb

+1

@gbjbaanb - Ich hatte ein Problem. Ich habe es gegoogelt. Ich habe diese Seite gefunden. Die Lösung *, die für mich funktionierte * war in einem Kommentar. Kommentare sind vergänglich, daher habe ich sie in eine Antwort kopiert, um sicherzustellen, dass sie für zukünftige Leute verfügbar ist. Ihre Antwort geht viel in das * warum *, aber der eigentliche Kernpunkt der Reparatur ist nicht klar. Wenn ich es jetzt wieder lese, stelle ich fest, dass die Antwort lautet "Setze seine Debug-Einstellungen, um den richtigen Debugger anzugeben", aber ohne Hans Passants Kommentar wüsste ich nicht, wo ich die Debug-Einstellungen einstellen soll oder was der "richtige Debugger" ist. – AndyT

+0

Vielleicht, da meine Situation etwas anders ist als deine (da ich bereits ein Projekt aus der ausführbaren Datei erstellt habe), hätte ich eine neue Frage stellen und diese Antwort darauf veröffentlichen sollen. Aber ich dachte, das wäre eine Verschwendung aller Zeiten. – AndyT

0

In meinem Fall habe ich eigenen Symbol-Server und TFS, also ich aktiviert Option TOOLS> Optionen> Debugging> Allgemein> "Quellserver-Unterstützung aktivieren" und drei Kind Optionen.

0

Für mich ist wurde das Debuggen einer UWP App in Xamarin Forms:

Ursache: Der Debugger-Dateien nicht in der .NET-Umgebung wird übersprungen wird.

Lösung: Uncheck Debugging => Allgemein => Aktivieren Just My-Code