2010-01-28 4 views
6

Ich verwende Visual Studio 2008, um einen Fehler in einem ausgeführten Prozess zu finden. Ich habe mich dem Prozess angeschlossen und das interessierende Modul identifiziert. (Es kommt vor, dass Debug-Symbole für dieses Modul aus einer PDB-Datei geladen wurden.) Ich möchte den disassemblierten Code im Disassembly-Fenster anzeigen, damit ich entscheiden kann, wo ein Haltepunkt gesetzt werden soll.Visual Studio 2008: So zeigen Sie disassemblierten Code für eine DLL an, die momentan nicht ausgeführt wird

Wenn ich den Vorgang abbringe, wird das aktuell ausgeführte Modul im Disassembly-Fenster angezeigt. Leider ist dies nicht das Modul von Interesse. Ich kann nicht herausfinden, wie man den Code für das Modul von Interesse zeigt, während es nicht ausgeführt wird.

Antwort

5

Vorausgesetzt, dass Sie einen nicht verwalteten Prozess debuggen ...

Wenn Sie "Debug/Pause All", gehen Sie folgendermaßen vor:

Wählen Sie "Debug/Windows/Module" eine Liste aller geladenen bekommen Module. In der Spalte "Adresse" im Modulfenster befindet sich der Speicherbereich für dieses Modul. Geben Sie im Feld "Address:" in Ihrem Disassembly-Fenster die Startadresse für das Modul ein (0x30.0):

Sie sollten jetzt am Anfang des Moduls sein, mit dem Sie spielen möchten . Wenn Sie die Adresse einer Funktion kennen, können Sie einfach zu dieser Adresse springen.

Hier ist ein Beispiel:

Run sol.exe an den Prozess anhängen, und brechen alle. Schauen Sie sich die Module an und finden Sie "cards.dll". Sie werden sehen, dass es bei 6fc10000 geladen wird (auf meinem Rechner sowieso).

Geben Sie diese Adresse (0x6fc10000) in das Disassembly-Fenster ein, und Sie gelangen zum Start des Moduls.

Jetzt sagen, ich möchte tatsächlich zu einer Funktion springen. Öffnen Sie die DLL in Dependency Walker (depends.exe), um die Offsets der Funktionen zu erhalten. In meinem Beispiel möchte ich einen Haltepunkt für die Funktion "cdInit" setzen. In Dependecny Walker wird angezeigt, dass der Offset zur exportierten Funktion cdInit 0x000013e6 ist. Um zu dieser Funktion zu gelangen, würde ich die Startadresse des Moduls (0x6fc10000) zum Offset (0x000013e6) hinzufügen, um 0x6fc113e6 zu erhalten.

Das Eingeben dieser Adresse in die Disassemblierungsbox springt mich tatsächlich direkt an den Anfang dieser Funktion.

0

Haben Sie versucht, den .Net Reflektor zu verwenden? Sie könnten den gesamten Code aus Ihrer DLL abrufen und möglicherweise sogar mit darin enthaltenen Debug-Nachrichten neu kompilieren. Es ist kostenlos:

http://www.red-gate.com/products/reflector/

Prost

+0

diese Arbeit mit nativen Code DLLs? –

+0

Leider funktioniert der Reflektor nur mit verwaltetem Code (.Net). Es ist auch nicht mehr frei :) –

1

tun Sachen wie diese ist weit leichter in WinDbg

uf cards!cdInit 
+0

Aber er fragt, wie man es in Visual Studio 2008 macht ... – GalacticJello

+0

Ich sage, dass er das falsche Werkzeug für den Job benutzt. Und es ist nicht so, als müsste er extra für WinDbg bezahlen, es ist kostenlos - jeder Entwickler sollte es installiert haben –