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