反汇编托管代码问题

Geo*_*ge2 1 .net c# debugging windbg

我正在使用Windbg使用!U来自sos.dll的Windbg 命令来组装托管代码(用C#编写,控制台应用程序).我发现当使用!Udiassemble一个托管函数时,反汇编的IL代码只包含我做的函数调用,例如a=a*2,对于其余部分(非函数调用C#代码)和foreachC#中的循环,只显示了本机汇编语言代码,这是正确的预期行为吗?

我的问题是,我想知道是否能够用所有代码(除了函数调用代码)将管理代码二进制DLL反汇编成IL?

提前谢谢,乔治

Bri*_*sen 9

如果要在调试时转储IL,可以使用!dumpilSOS中的命令.它需要一个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
Run Code Online (Sandbox Code Playgroud)

接下来,您可以执行一个!dumpil 00163450转储IL的方法,Foo就像这样

0:000> !dumpil 00163450
ilAddr = 73532050
IL_0000: ldstr "Foo"
IL_0005: call System.Console::WriteLine
Run Code Online (Sandbox Code Playgroud)

  • 你必须记住,IL代码实际上并没有运行.它被编译为本机代码,然后运行.但是,如果您执行崩溃进程的转储,则您将同时拥有JITTED代码和原始IL作为转储的一部分.使用!U显示CLR意识到生成代码的反汇编.使用!dumpil来显示IL.从异常堆栈跟踪和!name2ee,您应该能够根据需要找到JITTED和IL代码. (2认同)