我正在使用Windbg从sos.dll中使用Windbg的!U命令反汇编托管代码(用C#控制台应用程序编写)。我发现使用!U对托管函数进行反汇编时,经过反汇编的IL代码仅包含我进行的函数调用,而其余部分(非函数调用C#代码)包含例如C#中的a=a*2foreach循环,仅显示本机汇编语言代码,这是正确的预期行为吗?

我的问题是,我想知道!U是否能够将所有代码(除函数调用代码外)的托管代码二进制DLL分解为IL?

提前致谢,
乔治

最佳答案

如果要在调试时转储IL,可以使用SOS中的!dumpil命令。它以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转储方法Foo的IL。

0:000> !dumpil 00163450
ilAddr = 73532050
IL_0000: ldstr "Foo"
IL_0005: call System.Console::WriteLine

关于c# - 反汇编托管代码问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1558221/

10-11 22:35
查看更多