[VisualStudio] dll von externem Program debuggen

Schattenfänger

Lt. Junior Grade
Registriert
Nov. 2010
Beiträge
273
Hallo,
Ich muss für ein Programm eine Erweiterung in C# schreiben.
Diese wird als dll erstellt und zur Laufzeit dem Programm hinzugefügt/entfernt.

Mich würde interessieren wie ich nun die geladene dll debuggen kann?

Ich habe in der Projektmappe Debug statt Release drin und die dll sowie .pdb in dem Ordner welcher vom Programm erwartet wird.
Dann habe ich VisualStudio an das Programm attachet.

Wie kann ich nun die dll "normal" debuggen?
Muss ich nochwas einstellen?

Kann ich dann überhaupt anständig debuggen oder muss ich jedes Mal dann die neueste dll ins Verzeichnis kopiern?
 
Schreib dir doch einfach ein Testprogramm in der selben Projektmappe wo du deine DLL ansprichst und die Funktionen testest.
 
Wenn die Assembly nicht signiert ist, sollte es doch problemlos möglich sein, die Symbols zu laden und zu debuggen?

Wo hakt es denn? Gibt es Fehlermeldungen? Ansonsten wie mein Vorredner sagte Unit Tests schreiben, um die neue Funktionalität zu testen!
 
Schau dir das mal an bzgl. Umgebungsvariable DEVPATH. Wenn du den Weg über den DEVPATH gehst, kann es sein, dass du eine Kopie der von Dir erstellten Assembly erstmal in das Programverzeichnis legen musst. Diese Kopie musst du dann aber nicht ständig aktualisieren, da das Programm trotzdem die Version aus dem DevPath lädt. Die DevPath Umgebungsvariable würde ich auf das Ausgabeverzeichnis deines Projektes einstellen,z.B. Projektverzeichnis\bin\Debug.

Desweiteren würde ich in den Debugeinstellungen des Projektes die Option "Externes Programm starten" auswählen, den Pfad zu deinem Start-Program angeben, evtl. unter den Startoptionen noch die Argumente und das Arbeitsverzeichnis festlegen und dann kannst du aus der Solution heraus einfach das Debuggen starten...
 
Zuletzt bearbeitet:
DocWindows schrieb:
Schreib dir doch einfach ein Testprogramm in der selben Projektmappe wo du deine DLL ansprichst und die Funktionen testest.

Bringt mir genau gar nix wenn im Plugin Daten vom Hauptprogramm ausgewertet werden.
Dort wird eben auch ein Fehler geworfen denn ich nicht nachvollziehen kann. Und ja, Unit Tests funktionieren.
-Außerdem möchte ich sowieso wissen wie ich sowas anständig debuggen kann.


Wenn die Assembly nicht signiert ist, sollte es doch problemlos möglich sein, die Symbols zu laden und zu debuggen?

Wo hakt es denn? Gibt es Fehlermeldungen? Ansonsten wie mein Vorredner sagte Unit Tests schreiben, um die neue Funktionalität zu testen!

Na, es hakt daran, dass ich nicht weiß was ich machen muss nachdem ich VS an das laufende Programm gehängt habe.
Was sind Symbols? :O
Unter "module" sehe ich übrigends, dass das Programm von VS erkannt wird, aber wenn ich vom Programm die dll starte wird diese nicht erkannt (soll sie es überhaupt?).

Hab ich überhaupt richtig kopiert? Müssen die dll und pbd in das selbe Verzeichnis oder muss ich überhaupt mein Debug Verzeichnis von VS in den Plugin Ordner vom Programm setzen?


Desweiteren würde ich in den Debugeinstellungen des Projektes die Option "Externes Programm starten" auswählen, den Pfad zu deinem Start-Program angeben, evtl. unter den Startoptionen noch die Argumente und das Arbeitsverzeichnis festlegen und dann kannst du aus der Solution heraus einfach das Debuggen starten...

Mal schaun.

Ich starte aber kein Programm, das Programm läuft ständig, also verwende ich attach to process.

....Ahh okay, dass ist doch genau, dass was ich oben gefragt habe..


Edit:
Habe jetzt noch unter Debugging - Otpionen -debugging -Symbole den Pfad zum Plugin Ordner angegeben, dort wo ich die dll und pdb hinkopiere.w

Bei meinen Breakpoints kommt " wird nicht erreicht. keine Symbole geladen"
 
Zuletzt bearbeitet:
Hallo, google ".net debug external dll"!

https://www.google.de/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=.net debug external dll

Eventuell hilft das:

Try disabling Just My Code (JMC).

Tools -> Options -> Debugger
Uncheck "Enable Just my Code"
By default the debugger tries to restrict the view of the world to code that is only contained within your solution. This is really heplful at times but when you want to debug code which is not in your solution (as is your situation) you need to disable JMC in order to see it. Otherwise the code will be treated as external and largely hidden from your view.

EDIT

When you're broken in your code try the following.

Debug -> Windows -> Modules
Find the DLL for the project you are interested in
Right Click -> Load Symbols -> Select the Path to the .PDB for your other project

Von: http://stackoverflow.com/questions/...ernal-class-library-projects-in-visual-studio
 
Danke, das habe ich allerdings auch schon gemacht.

Habe ich die Tuts richtig verstanden? Wenn es funktioniert führe ich Funktionen mit dem Programm von der dll aus und es sollte mir ein Breakpoint anspringen?
Oder muss ich dazwischen noch was machen?
 
Naja, vertu ich mich oder bringt nur die PDB allein ohne den Source code nicht allzu viel? In der pdb stehen zwar Variablen- und Zeileninformationen drin, aber ohne das Sourcefile bringt es Dir nicht so viel...

Ich weiß ja nicht, wieviel Code das ist, aber evtl. hilft Dir ILSpy oder sowas weiter?
 
Setz mal einen Breakpoint und häng den Debugger von Visual Studio an das laufende Programm. Was passiert dann? Wird der Breakpoint mit einem Kreis und einem kleinen gelben Symbol dargestellt oder ist es ein "voller" Punkt. Bei ersterem kann es verschiedene Ursachen haben, z.B. stimmt der Quellcode nicht mehr mit der kompilierten Version der DLL überein oder es wurden keine Symbole geladen oder der Code wurde optimiert oder weitere Möglichkeiten. Wenn der Breakpoint jedoch ein voll ausgefüllter Punkt ist, dann stehen die Chancen nicht schlecht dass du deine DLL debuggen kannst. du musst dann einfach nur in deinem Programm eine Aktion auslösen, sodaß der Code in der DLL ausgeführt wird. Oder was ist nun dein Problem? Die andere Sache ist die, dass wenn dein Programm bereits läuft und du erst danach die DLL ins Verzeichnis kopierst, vermute ich mal, dass die DLL dann auch nicht automatisch geladen wird. Ein Neustart des Programms wäre da notwendig...
 
Zurück
Oben