2008-08-12 23 views
22

¿Hay algún depurador de nivel de IL en forma de un plugin de VS o una aplicación independiente?Depurador de código de nivel de IL

El depurador de Visual Studio es excelente, pero le permite depurar en el nivel de código HLL o en el lenguaje ensamblador, no puede depurar IL. Parece que en algunas situaciones sería útil tener la oportunidad de depurar a nivel de IL.

En particular, podría ser útil al depurar un problema en el código que no tiene la fuente de.

Es discutible si en realidad es útil depurar IL cuando no se tiene la fuente, pero de todos modos.

Respuesta

19

La mejor manera de hacerlo es usar ILDASM para desensamblar el binario administrado, que generará las instrucciones IL. A continuación, vuelva a compilar ese código fuente de IL en modo de depuración utilizando ILASM, cuando inicie el depurador de Visual Studio podrá recorrer el IL sin procesar.

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

He escrito un post sobre este tema en: How to debug Compiler Generated code.

+2

Es un buen enfoque, pero no puede usarlo para un ensamblaje firmado. – axk

0

ISTR hay un complemento de depurador para Reflector.

No utilizado yo mismo, aunque he utilizado TestDriven.net para depurar un montaje de 3 ª parte con la ayuda del reflector:

weblogs.asp.net/nunitaddin

0

Aquí es un article sobre IL depuración. Dice que no puedes hacerlo y luego habla sobre formas de hacerlo. También hay algo de información en los comentarios sobre hacerlo también.

1

El complemento Debug Companion VS parece ser exactamente lo que estaba buscando, excepto que no verá proyecto de biblioteca en mi solución. Solo cuando agregué una aplicación win de consola a la solución apareció algo en esa lista de proyectos.

El problema con el enfoque de descompilación/compilación para mí era que el código que estaba depurando no era mi código. Podría haberlo descompilado de todos modos, pero creo que no hay forma de firmar ese ensamblado recompilado para que se cargue en lugar del ensamblado original.

Con el problema particular que tuve resultó que era suficiente para depurarlo en el nivel de lenguaje ensamblador y obtener la pila de llamadas del método que arrojaba la excepción y los parámetros con los que se llamó el método.

1

Aquí está el archivo .BAT que utilizo para depurar IL ensamblador en Visual Studio. El archivo .IL.IL creado contiene las líneas de código fuente originales y las líneas de ensamblador de IL generadas, pero no muestra el código de máquina jitted. Llamé al archivo por lotes ILDEB.BAT y se invoca como "ILDEB mypgm". Uso el "break" de la directiva de ensamblador de IL para forzar al depurador de Visual Studio a un punto de interrupción cuando se golpea.

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

¿Lo ejecuta en un paso posterior a la compilación en su entorno de estudio visual? –

+1

Actualmente invoco desde la línea de comando. Sin embargo, no veo ninguna razón técnica por la que no funcionaría. IIRC, ya probé en un paso posterior a la compilación y funciona como se esperaba. – BSalita

+1

Puede reemplazar '% NAME_ONLY%' con '% ~ dpn1' y deshacerse de la primera línea – Adassko

Cuestiones relacionadas