问题标签 [il]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - IL 级代码调试器
是否有任何以 VS 插件或独立应用程序形式存在的 IL 级调试器?
Visual Studio 的调试器很棒,但它允许您在 HLL 代码级别或汇编语言上进行调试,您无法调试 IL。似乎在某些情况下,有机会在 IL 级别进行调试会很有用。
特别是在调试您没有源代码的问题时,它可能会有所帮助。
当您没有源代码时调试 IL 是否真的有用是有争议的,但无论如何。
.net - 存在哪些 CLR/.NET 字节码工具?
我非常了解用于操作、生成、反编译 JVM 字节码(ASM、cglib、jad 等)的 Java 工具。CLR 字节码有哪些类似的工具?人们是否为 CLR 进行字节码操作?
c - .NET 开发人员*真的*应该花时间学习 C 以进行低级接触吗?
当 Joel Spolsky 和 Jeff Atwood 在他们的播客中开始就程序员是否应该学习 C 产生分歧时,无论他们的行业和交付平台如何,它在开发人员社区内引发了一场相当爆炸性的辩论,今天可能仍在某些群体中肆虐。我一直在阅读一些程序员博主的文章,他们对此事的看法。双方的论点当然很重要,但我没有发现从只专注于 .NET Framework的开发人员的角度来看,这是一个独特的视角。几乎所有人都在评论一般程序员的观点。
我想达到什么目的?回想一下 Jeff Atwood 的观点,即处于如此高水平的开发人员将花费的大部分时间都花在学习业务/领域上,而不是学习满足这些领域需求的技术所需的一切。以我的工作经验,这是对许多工作生活的非常准确的描述。现在假设 .NET 开发人员可以花时间进行“课外”学习,那应该是 C 吗?
作为记录,我自己在学校就学过 C,我完全可以理解和欣赏支持者的推理。但是,仔细考虑之后,我个人认为 .NET 开发人员不应该直接研究 C。因为,我希望更多的开发人员花一些时间来学习 - MSIL和CLR。
也许我被一群不寻常的同事困住了,我不知道,但在我看来,很多人并没有意识到他们的 C# 或 VB 代码在 JIT 进入并使其成为原始机器之前首先在 IL 中编译代码。大多数人不了解 IL,并且对 CLR 如何准确处理他们编写的代码不感兴趣。通过 C#阅读 Jeffrey Richter 的CLR在很多方面都让我感到震惊。很高兴我读了它,尽管同事们认为它“水平太低”。我不是 IL 专家,但有了基础知识,我发现自己更容易理解他的文字,因为我已经熟悉了 IL 的堆栈行为。我发现自己在反汇编程序集,以查看当我编写某些代码时 IL 的结果。
我学习 CLR 和 MSIL 因为我知道那是我下面的直接层。允许我执行自己的工作的层。C,实际上是进一步下降。更接近我们“现实”的是CLR和MSIL。这就是为什么我会建议其他人尝试这些,因为我没有看到足够多的人深入研究这一层。或者,您的团队是否已经全部熟悉 MSIL?
.net - .Net 中有类似 Java 描述符的东西吗?
我正在为.NET 程序集开发一个静态分析工具。在 Java 中,有一个Descriptor可用于表示具有指定语法的字符串中的方法或字段。
对于领域:
double d[][][];
将会
[[[D
它在进行字节码分析时特别有用。因为这很容易描述。如果.NET CLR 中有类似的东西?还是有更好的方法来实现这一目标?谢谢!
.net - In .NET, is the call stack inextricably tied to a thread?
Is it at all possible in the middle of a function execution to set a pointer to the current stack (to be picked up later) and then release the current thread (without unwinding the call stack) and give it back to the thread pool? And then, have another thread pick up where that thread left off? I know it would mean that someone calling into the function would not know that the current thread context would have changed, and it would probably involve writing some custom IL code to do something like this, but is there ANY way to do this?
debugging - 调试 .NET CLR 应用程序时,如何查看评估堆栈上的局部变量?
我正在使用 Windbg(带有 sos 扩展名)并尝试调试崩溃的应用程序。我能够转储引发异常的调用的 IL,并且通过检查代码,如果我可以转储评估堆栈的内容,我似乎可以获得所需的信息。可以用 WinDbg & sos 做什么吗?
这是我所做的:
- 启动 WinDbg
- 附加到崩溃的进程
- loadby sos mscorwks (加载 sos 扩展)
!token2ee theModuleName 0600009a (其中theModuleName是我正在调试的应用程序(和程序集)的名称,9a是 Windows 错误报告工具报告的崩溃方法的方法偏移量。我得到了这个输出:
模块:000e2c3c (theApplicationName.exe)
令牌:0x0600009a
MethodDesc:000e67c8
名称:MyNamespace.MyClassName.theCulpritFn(MyOtherClass)
JITTED 代码地址:0081b1d0!dumpil 00e67c8 (它为所讨论的方法转储了 IL)。这是输出:
问题是:有没有办法让我看到在抛出异常之前压入堆栈的内容。如果我没记错的话,传递给异常构造函数的参数应该是评估堆栈上索引 0 处的局部变量。
PS 当我尝试调用!clrstack -a时,我收到一条消息:无法遍历托管堆栈。当前线程可能不是托管线程。您可以运行 !threads 以获取进程中的托管线程列表。
谢谢!
c# - 在带有事件的动态类型上实现接口
我正在接受一个接口,循环遍历 .GetEvents() 返回数组并尝试在我的动态类型上实现该事件。当我尝试调用 TypeBuilder.CreateType() 时,我遇到了这个可爱的错误:
“来自程序集的类型的应用程序方法正在覆盖已被覆盖的方法。”
如果我注释掉尝试实现接口方法的 typeBuilder.DefineMethodOverride 调用,那么当我尝试订阅事件时,我会收到错误消息:
“方法或操作未实现。”
这是我尝试将检测到的事件添加到发出类型的方法。快速说明一下,我还有其他代码定义了类型并添加了在接口上实现这些方法的方法,所有这些代码都可以正常工作。在我尝试将事件添加到组合中之前,我没有遇到任何问题。
谷歌对此的帮助为零(搜索“正在覆盖已被覆盖的方法”只会返回很多水晶报表主题),而我整个上午都在为此苦苦挣扎。任何帮助将不胜感激!
c# - 为什么 C# 编译器会为 GetType() 方法调用发出 callvirt 指令?
我很想知道为什么会这样。请阅读下面的代码示例以及在每个部分下方的注释中发出的相应 IL:
为什么编译器callvirt
为第一部分发出 a 而call
为第二部分发出 a ?编译器是否有任何理由会callvirt
为非虚拟方法发出指令?如果在某些情况下编译器会callvirt
为非虚拟方法发出 a ,这是否会给类型安全带来问题?
.net - 在 IL 中查找方法调用的参数值
我有几个特殊的方法,我想分析它们在编译的程序集中调用。
例子:
从这个编译的代码中,我想得到参数值{“应该创建具有指定大小的“,MyClass,”数组。” }。我尝试使用 Mono 的 Cecil,并找到了调用“ToDo”方法的说明。但是现在我很困惑如何用参数值来识别指令。
我知道,情况可能很复杂,有些参数的值无法解决。但我只需要解析常量值 - 这足以满足我的目的。
谢谢。
编辑: “ToDo”方法(和类似方法)应用作注释的替代方法( //, /* ... */ ),编译后,应进行 IL 分析并自动生成文档和具体装配的 todo-list .
reflector - 为什么人们要反汇编 .NET (CLR) 二进制文件?
我对 .NET 有点陌生,但对编程并不陌生,而且我对反汇编已编译的 .NET 代码的趋势和兴奋感到有些困惑。似乎毫无意义。
.NET 的高级易用性是我使用它的原因。我在资源有限的环境中编写了 C 和真实(硬件处理器)程序集。这就是为什么要在如此多的细节上花费精力,以提高效率。在 .NET 领域,如果您浪费时间深入研究实现的最隐秘的细节,这有点违背了拥有高级面向对象语言的目的。在使用 .NET 的过程中,我调试了常见的性能问题和奇怪的竞争条件,我通过阅读自己的源代码完成了这一切,从来没有想过编译器正在生成什么中间语言。例如,考虑到 foreach() 将使用枚举,很明显 for(;;) 循环将比数组上的 foreach() 更快对象带有一个方法调用来前进到下一次,而不是简单地增加一个变量,这很容易通过一个紧密的循环运行几百万次来证明(不需要反汇编)。
真正让反汇编 IL 变得愚蠢的是它不是真正的机器代码。是虚拟机代码。我听说有些人实际上喜欢移动指令来优化它。你在开玩笑吧?即时编译的虚拟机代码甚至无法以本机编译代码的速度执行简单的紧 for(;;) 循环。如果您想从处理器中挤出最后一个周期,那么请使用 C/C++ 并花时间学习真正的汇编。这样一来,您花在了解许多低级细节上的时间实际上是值得的。
那么,除了手头有太多时间之外,人们为什么还要反汇编 .NET (CLR) 二进制文件呢?