2008-08-12 5 views
22

Gibt es einen IL-Level-Debugger in Form eines VS-Plugins oder einer eigenständigen Anwendung?IL-Level-Code-Debugger

Visual Studio-Debugger ist großartig, aber es ermöglicht Ihnen, auf HLL-Code-Ebene oder Assembler-Sprache zu debuggen, können Sie IL nicht debuggen. Es scheint in einigen Situationen sinnvoll zu sein, auf IL-Ebene debuggen zu können.

Insbesondere kann es hilfreich sein, wenn Sie ein Problem im Code debuggen, von dem Sie nicht die Quelle haben.

Es ist fraglich, ob es tatsächlich nützlich ist, IL zu debuggen, wenn Sie die Quelle nicht haben, aber trotzdem.

Antwort

19

Der beste Weg, dies zu tun ist, ILDASM zu verwenden, um die verwaltete Binärdatei zu zerlegen, die die IL-Anweisungen generieren wird. Kompilieren Sie dann den IL-Quellcode im Debug-Modus erneut mit ILASM. Wenn Sie den Visual Studio-Debugger starten, können Sie die rohe IL durchlaufen.

  1. ildasm foo.exe /OUT=foo.exe.il /SOURCE
  2. ilasm foo.exe.il /DEBUG

ich einen Blog-Post zu diesem Thema unter geschrieben haben: How to debug Compiler Generated code.

+2

Es ist ein guter Ansatz, aber Sie können es nicht für eine signierte Assembly verwenden. – axk

0

ISTR gibt es ein Debugger-Plug-in für Reflektor.

es selbst nicht verwendet, obwohl ich TestDriven.net verwendet haben eine 3rd-Party-Montage mit Hilfe von Reflector zu debuggen:

weblogs.asp.net/nunitaddin

0

Hier ein article über IL-Debugging ist. Es sagt, du kannst es nicht tun und dann darüber sprechen, wie es geht. Es gibt auch einige Informationen in den Kommentaren darüber, es auch zu tun.

1

Debug Companion VS Plugin scheint genau das zu sein, was ich gesucht habe, außer dass es Bibliotheksprojekt in meiner Lösung nicht sehen wird. Nur wenn ich eine Console Win-Anwendung zur Lösung hinzufügte, tauchte etwas in dieser Liste von Projekten auf.

Das Problem mit dem Dekompilieren/Kompilieren für mich war, dass der Code, den ich debugging, nicht mein Code war. Ich hätte es trotzdem dekompilieren können, aber ich denke, es gibt keine Möglichkeit, diese neu kompilierte Assembly zu signieren, so dass sie statt der ursprünglichen geladen wird.

Mit dem speziellen Problem hatte ich herausgefunden, dass es genug war, um es nur auf der Assembly-Sprache Ebene zu debuggen und den Aufruf-Stack der Methode, die die Ausnahme und die Parameter, mit denen die Methode aufgerufen wurde, werfen.

1

Hier ist die .BAT-Datei, die ich zum Debuggen von IL Assembler in Visual Studio verwenden. Die erstellte .IL.IL-Datei enthält die ursprünglichen Quellcodezeilen und Ihre generierten IL-Assemblerzeilen, jedoch keinen Jitter-Maschinencode. Ich benannte die Batch-Datei ILDEB.BAT und wird als "ILDEB mypgm" aufgerufen. Ich benutze die IL-Assembler-Direktive "break", um Visual Studio-Debugger zu zwingen, beim Treffer einen Breakpoint zu setzen.

for /f "tokens=1 delims=." %%1 in ("%1") do set NAME_ONLY=%%1 
@erase/q %NAME_ONLY%.il.il 
@if not exist %NAME_ONLY%.dll goto quit 
ildasm /out:%NAME_ONLY%.il.il /source /nobar %NAME_ONLY%.dll 
@if not exist %NAME_ONLY%.il.il goto quit 
ilasm /dll /debug /out=%NAME_ONLY%.dll %NAME_ONLY%.il.il 
@if not exist %NAME_ONLY%.dll goto quit 
peverify %NAME_ONLY%.dll 
:quit 
+0

Führen Sie dies in einem Post-Build-Schritt in Ihrer Visual Studio-Umgebung durch? –

+1

Momentan rufe ich von der Kommandozeile auf. Ich sehe jedoch keinen technischen Grund, warum es nicht funktionieren würde. IIRC, habe ich bereits in einem Post-Build-Schritt getestet und es funktioniert wie erwartet. – BSalita

+1

Sie können% NAME_ONLY% durch '% ~ dpn1' ersetzen und die erste Zeile loswerden – Adassko