Hallo!
Ich würde gerne eine C#/.NET DLL debuggen. Folgendes Szenario sei gegeben:
Anwendung "A" generiert zur Laufzeit .NET Code, kompiliert diesen zu einer DLL "D" und ruft Funktionen daraus auf.
Wie kann ich nun von außen diese DLL debuggen, d.h. Breakpoints setzen und dann Variablen ansehen (während Anwendung "A" damit arbeitet)?
Gruß,
Bernd
Hallo,
öffne das Dll-Projekt, starte das benutzende Programm und hänge Dich mit dem Debugger an das laufende Programm (unter Debuggen->An den Prozess anhängen...". Dann solltest Du ganz normal debuggen können.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Hallo VanKurt,
wenn dir der Quellcode der DLL-Datei vorliegt, kannst du es mit Visual Studio debuggen. Falls nicht, und du die PDB-Datei hast, kannst du die PDB in Visual Studio miteinbinden und dann so die DLL debuggen. Desweiteren kannst du in Visual Studio unter "Debuggen" => "An Prozess anhängen" wählen.
zero_x
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
Das hab ich eigentlich schon versucht:
Ich habe das VS Projekt der DLL geöffnet und mich an den Prozess der Anwendung "A" angehängt (DLL und PDB wurden von "A" erzeugt).
Allerdings tut sich da nix (Breakpoints werden nicht gesetzt da Symbole nicht verfügbar)...
generiert zur Laufzeit ... DLL "D" ... diese DLL debuggen
Wenn du damit meinst, dass die Anwendung wirklich eine DLL generiert, ist das so wie oben beschrieben möglich. wenn sie allerdings nur eine RunTime-Assembly generiert und diese ausführt, glaube ich leider nicht, dass das möglich ist.
Gruß, Christian.
Mit "Symbole" sind hier die pdb`s gemeint. Du kannst sie im Module-Fenster nachladen lassen.
Debuggen kannst du allerdings immer auf Disassembler-Level. Dort kannst du auch die Lokalen variablen einsehen (im Locals-Fenster). Das geht immer... unabhängig davon ob pdb`s oder sourcen vorhanden sind.
Wenn du das ganze per CodeDom machst, kannst du dir mal ModuleBuilder.DefineDocument, ILGenerator.MarkSequencePoint und LocalBuilder.SetLocalSymInfo ansehen.
Soo, jetzt bin ich schon mal einen Schritt weiter.
Die Symbole werden jetzt gefunden und die Breakpoints sind aktiv.
Das Problem war (unter anderem) dass die Anwendung aus meheren Prozessen bestand und ich am falschen hing.
Merkwürdigerweise werden die Breakpoints aber immer noch nicht getriggert, obwohl sie jetzt mit Symbolen verknüpft sind und der Code definitiv ausgeführt wird...
ARGH!!!
Falls man keine Symbole hat, kann man auch den Reflector (Pro Variante) benutzen. Wie das geht:
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...
Nagut, aber Symbole hab ich ja mittlerweile 🙂
Ich kann sogar über den play/pause Button die ausführung des DLL Codes anhalten. Aber leider werden die Breakpoints trotzdem nicht getriggert....
ARGH!
Füg mal den Pfad zu den Symbolen manuell hinzu (siehe Bild).
Ansonsten kannst du auch über die Aufrufliste mit rechter Maustaste Symbole laden.
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...
Den Pfad hatte ich schon hinzugefügt. Und die Symbole werden wie gesagt automatisch geladen, da brauche ich also manuell nichts mehr zu machen...