2008-11-26 6 views
9

Próbuję wygenerować kod w czasie wykonywania przy użyciu klasy DynamicMethod w przestrzeni nazw Reflection.Emit, ale z jakiegoś powodu rzuca "VerificationException". Oto kod IL, którego próbuję użyć ...Jak debugować kod IL wygenerowany w czasie wykonywania za pomocą Reflection.Emit

ldarg.1 
ldarg.0 
ldfld, System.String FirstName 
callvirt, Void Write(System.String) 
ldarg.1 
ldarg.0 
ldfld, System.String LastName 
callvirt, Void Write(System.String) 
ldarg.1 
ldarg.0 
ldfld, Int32 Age 
callvirt, Void Write(Int32) 
ret 

Potrzebuję sposobu na debugowanie wygenerowanego kodu IL. Jakie mam opcje? Używam profesjonalnego VS2008.

Odpowiedz

2

Spróbuj użyć narzędzia peverify, aby sprawdzić IL. Od MSDN:

peverify.exe wykonuje kompleksowe kontrole weryfikacji MSIL oparte na analizie przepływu danych plus listy kilkuset reguł obowiązujących metadanych . W celu uzyskania szczegółowych informacji na temat kontroli Peverify.exe wykonuje patrz „Metadane Validation Specyfikacja” i „MSIL Instruction Set Specyfikacja” w Narzędzia folderu Developers Guide w .NET Framework SDK.

Musisz zapisać wygenerowany kod na dysku jako zespół, aby było to przydatne.

0

Nie ma sposobu debugowania IL bezpośrednio w sensie używania debuggera (przynajmniej nie wbudowanego). Naprawdę masz tylko dwie opcje:

  1. Zapytaj Roba zasugerował. Ręcznie wpisz IL i ilasm do DLL/EXE. Następnie uruchom peverify na wynikowej bibliotece DLL, aby zobaczyć swój błąd.
  2. Jeśli rzeczywiście chcesz debugować IL, prawdopodobnie utknąłeś z robieniem tego surowego zestawu.
0

Musisz emitować symboliczne informacje, aby móc debugować IL.

Emitting Symbolic Information with Reflection Emit

i mecz emitowanych opcodes z umieszczeniem coresponding w pliku, który emituje go. (Gdzie ILGenerator.Emit() jest wywołanie).

Ale to z pewnością nie jest trywialne zadanie.

Edit:

nie można debugowania kodu, który nie jest sprawdzalne, to nie dostać JIT-ed w ogóle. Musisz sprawdzić poprawność wykorzystania IL-ów op. czy każdy ma w stosie odpowiednie operandy wymaganego typu, którego oczekuje?

Edit 2:

i łatwy sposób, aby to zrobić jest stworzenie kodu C# a następnie użyć Reflector lub jakiś inny dezasembler IL IL zbyt zobaczyć i porównać go do Ciebie.

Edycja 3: Niestety informacje debugowania nie mogą być emitowane za pomocą DynamicMethod, ale WinDBG może być użyty do zrzutu IL, Jose Fco Bonnin wyjaśnia to na swoim blogu.Executing dynamic IL with DynamicMethod:

Głównym problemem doświadczamy z DynamicMethod jest to, że nie mamy zdolność do generowania debugowania informacji dla LCG, ponieważ API debugowania jest na podstawie metadanych że LCG nie nie. W każdym razie nie wszystko jest stracone , ponieważ możemy kontynuować debugowanie za pomocą WinDBG. ...

proces zostanie wyjaśniony dalej w poście.

+0

Czy mogę używać informacji symbolicznych metodami dynamicznymi (LCG)? Sprawdziłem swoją IL przeciwko reflektorowi i są one identyczne. Ale nie jestem pewien, czy wygenerowany il jest ** faktycznie ** indentical. –

+0

Dokonałem edycji, aby odpowiedzieć na twoje pytanie, mam nadzieję, że pomoże. –

0

To może nie pomóc w zakończeniu debugowania, ale RunSharp jest dobrym narzędziem do generowania IL, które pomaga uniknąć typowych pułapek. To sprawia, że ​​pisanie IL-a przypomina bardziej pisanie C#.

Oto przegląd przykładów: http://www.codeproject.com/KB/dotnet/runsharp.aspx

+0

Próbowałem RunSharp i muszę powiedzieć, że byłem pod wrażeniem, ale w końcu zdecydowałem się zrobić to na własnej skórze, ponieważ wydaje się, że został porzucony. Na przykład nie można sprawdzić zwracanej wartości wywołania metody (Invoke nie ma mechanizmu zwracającego wartość zwracaną)! –

0
ldarg.1 
ldarg.0 
ldfld, System.String FirstName 
callvirt, Void Write(System.String) 

Na tym etapie nadal mają ARG1 na stosie.

+1

Tak, który jest używany jako argument do wywołania BinaryWriter :: Write. Jest to odniesienie do obiektu BinaryWriter i jest przekazywane jako "ten wskaźnik". –

+0

Dobrze :) Brakowało tego! – leppie

Powiązane problemy