我正在使用Windbg使用来自sos.dll的Windbg !U
命令来组装托管代码(用C#编写,控制台应用程序)。我发现当使用!U
来组合托管函数时,反汇编的IL代码只包含我所做的函数调用,以及其余部分(非函数调用C#代码),例如a=a*2
和{{ C#中的循环,只显示本机汇编语言代码,是正确的预期行为吗?
我的问题是,我想知道是否!U能够将所有代码(除了函数调用代码)反汇编到托管代码二进制DLL中吗?
提前致谢, 乔治
答案 0 :(得分:9)
如果要在调试时转储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
答案 1 :(得分:1)
我不认为WinDbg在IL级别工作。您可能必须使用ildasm
来获取IL反汇编。