Cod de depanare la nivel de IL

Există vreun depanator la nivel de IL în formă de plugin VS sau de aplicație autonomă?

Visual Studio? S debugger este minunat, dar vă permite să depanare la nivel de cod HLL sau limbaj de asamblare, nu puteți depana IL. Se pare că, în anumite situații, ar fi util să existe o oportunitate de depanare la nivelul IL.

În special, ar putea fi util atunci când depanem o problemă din codul în care nu aveți sursa.

Este discutabil dacă este de fapt util să depanați IL atunci când nu aveți sursa, dar oricum.

0
fr hi bn

5 răspunsuri

Aici este un articol despre depanarea IL. Se spune că nu o poți face și apoi vorbește despre modalități de a face acest lucru. Există, de asemenea, unele informații în comentariile despre acest lucru, de asemenea.

0
adăugat

Cel mai bun mod de a face acest lucru este să utilizați ILDASM pentru a dezasambla binarul gestionat, ceea ce va genera instrucțiunile IL. Apoi, recompilați codul sursă IL în modul de depanare utilizând ILASM, când declanșați programul de depanare Visual Studio, veți putea trece prin IL-ul brut.

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

Am scris un post de blog despre acest subiect la: Cum se depanează compilatorul Codul generat .

0
adăugat
Este o abordare bună, dar nu o puteți folosi pentru un ansamblu semnat.
adăugat autor axk, sursa

Debug Companion VS plugin pare să fie exact ceea ce căutam, cu excepția faptului că nu va vedea proiectul de bibliotecă în soluția mea. Numai atunci când am adăugat o aplicație de câștigare a consolei la soluție, a apărut ceva în lista respectivă de proiecte.

Problema cu abordarea decompilare/compilare pentru mine a fost că codul pe care l-am depanat nu era codul meu. I-ar fi putut decompila oricum, dar cred că nu există nicio modalitate de a semna acea adunare recompilată, astfel încât să fie încărcată în locul celei originale.

Cu problema particulară pe care am avut-o sa dovedit că a fost suficient să se depaneze doar la nivelul limbajului de asamblare și să se primească stiva de apel a metodei care arunca excepția și parametrii cu care a fost apelată metoda.

0
adăugat

ISTR există un plug-in de depanare pentru Reflector.

Nu am folosit-o eu, deși am folosit TestDriven.net pentru a debuga un ansamblu terț cu ajutorul reflectorului:

weblogs.asp.net/nunitaddin

0
adăugat

Iată fișierul .BAT pe care îl folosesc pentru a depana asamblarea IL în Visual Studio. Fișierul .IL.IL creat conține liniile originale ale codului sursă și liniile dvs. de asamblare IL generate, dar nu indică codul mașinii jitted. Am numit fișierul lot ILDEB.BAT și este invocat ca "ILDEB mypgm". Folosesc directiva de asamblare a IL "break" pentru a forța aplicația de depanare Visual Studio să se întrerupă atunci când este lovită.

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
adăugat
În prezent, invoc din linia de comandă. Cu toate acestea, nu văd niciun motiv tehnic pentru care nu ar funcționa. IIRC, am testat deja într-un pas post build și funcționează conform așteptărilor.
adăugat autor BSalita, sursa
Puteți să înlocuiți % NAME_ONLY% cu % ~ dpn1 și să scăpați de prima linie
adăugat autor Adassko, sursa
Rulați acest lucru într-un pas post-construire în mediul dvs. de studio vizual?
adăugat autor Shahzad Qureshi, sursa