разобрать проблему управляемого кода - PullRequest
1 голос
/ 13 октября 2009

Я использую Windbg для дизассемблирования управляемого кода (написанного на C #, консольное приложение) с помощью команды Windbg !U из sos.dll. Я обнаружил, что при использовании !U для дизассемблирования управляемой функции в дизассемблированном коде IL содержатся только те вызовы функций, которые я сделал, а для остальных частей (код вызова C # вне функции), например, циклы a=a*2 и foreach в C # , отображается только код на языке ассемблера, это правильное ожидаемое поведение?

У меня вопрос, я хочу знать, способен ли! U разбирать двоичный DLL управляемого кода в IL со всем кодом (кроме кода вызова функции)?

Заранее спасибо, George

Ответы [ 2 ]

9 голосов
/ 13 октября 2009

Если вы хотите сбросить IL во время отладки, вы можете использовать команду !dumpil из SOS. Он принимает указатель MethodDesc в качестве входных данных, поэтому вы должны сначала получить его.

Один из способов получить указатель MethodDesc - использовать команду !name2ee.

Так, например, если у вас есть метод Foo в типе Bar (в сборке ClassLibrary1), используйте !name2ee вот так

0:000> !name2ee ClassLibrary1!ClassLibrary1.Bar.Foo
Module: 001630bc (ClassLibrary1.dll)
Token: 0x06000001
MethodDesc: 00163450  <=== HERE
Name: ClassLibrary1.Bar.Foo()
JITTED Code Address: 007500f0

После этого вы можете сделать !dumpil 00163450, чтобы сбросить IL для метода Foo следующим образом

0:000> !dumpil 00163450
ilAddr = 73532050
IL_0000: ldstr "Foo"
IL_0005: call System.Console::WriteLine
1 голос
/ 13 октября 2009

Я не думаю, что WinDbg работает на уровне IL. Возможно, вам придется использовать ildasm для разборки IL.

...