c# - 反汇编托管代码问题

标签 c# .net debugging windbg

我正在使用 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/

相关文章:

mysql - .NET Web 服务使许多 MySQL 连接保持打开状态并出现 TIME_WAIT

.net - 将 DataMember 添加到 WCF 中的现有 DataContract

c# - 匹配进程参数的正则表达式

ios - 安装发布和调试 iOS

c# - 我无法在 C# 中使用 WMPLib 获取艺术家和专辑的名称

c# - 如何使用后期绑定(bind)访问 Microsoft Word 现有实例

java - Eclipse 调试器不会在条件断点处停止

c - 需要帮助使用 MPI 调试并行矩阵乘法

c# - XAML:如何将元素绑定(bind)到属性的名称是动态的,在不同的地方可以有不同的名称

c# - 什么更好 : int. TryParse 或 try { int.Parse() } catch