我正在使用 Windbg 从 sos.dll 使用 Windbg 的 !U
命令来分解托管代码(用 C# 编写,控制台应用程序)。我发现在使用 !U
反汇编托管函数时,反汇编的 IL 代码仅包含我进行的函数调用,其余部分(非函数调用 C# 代码),例如 a= a*2
和 C# 中的 foreach
循环,仅显示 native 汇编语言代码,这是正确的预期行为吗?
我的问题是,我想知道 !U 是否能够将托管代码二进制 DLL 分解为具有所有代码(函数调用代码除外)的 IL?
提前致谢, 乔治
最佳答案
如果您想在调试时转储 IL,您可以使用 SOS 中的 !dumpil
命令。它需要一个 MethodDesc 指针作为输入,因此您必须先获取它。
获取 MethodDesc 指针的一种方法是使用 !name2ee
命令。
例如,如果您在 Bar
类型(在程序集 ClassLibrary1
中)中有一个方法 Foo
,请使用 !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/