gpt4 book ai didi

compiler-construction - 使 CLR/.NET 语言可调试

转载 作者:行者123 更新时间:2023-12-03 12:49:08 25 4
gpt4 key购买 nike

使 CLR/.NET 语言可调试的资源有哪些?我正在开发一个 ActionScript 3 to IL 编译器,它使用 DLR CallSite 和 CallSiteBinders 来处理其他静态编程语言的动态方面。我正在寻找有关将发出的 IL 映射回源代码的任何信息,并且我还想知道如何使动态调用站点也映射回来。

所以这最终是两个问题:

  • 如何使 IL 可调试?
  • 如何使 DLR 调用站点可调试?

  • 任何帮助将不胜感激!

    我在“debuggabilty”方面寻找什么

    在附加的 Visual Studio 实例中:
  • 单步执行代码
  • 查看本地人
  • 查看堆栈跟踪
  • 最佳答案

    要使 IL 可调试,您需要将代码编译为可调试程序集。还有一个直接的缺点是组件将无法被 GC 收集。要做到这一点,你要做AppDomain.CurrentDomain.DefineDynamicAssembly ,然后您调用DefineDynamicModule并在程序集中定义一个模块。要使其可调试,您需要在其上设置一些属性:

    DebuggableAttribute.DebuggingModes attrs =
    DebuggableAttribute.DebuggingModes.Default |
    DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints |
    DebuggableAttribute.DebuggingModes.DisableOptimizations;

    Type[] argTypes = new Type[] { typeof(DebuggableAttribute.DebuggingModes) };
    Object[] argValues = new Object[] { attrs };

    _myAssembly.SetCustomAttribute(new CustomAttributeBuilder(
    typeof(DebuggableAttribute).GetConstructor(argTypes), argValues)
    );

    _myModule.SetCustomAttribute(new CustomAttributeBuilder(
    typeof(DebuggableAttribute).GetConstructor(argTypes), argValues)
    );

    最后在发出 IL 时调用 MarkSequencePoint 标记以下 IL 指令的行。

    让 DLR 调用站点可调试对我来说似乎很奇怪——通常您的调用站点不会包含任何用户代码。相反,它将包含执行操作的代码,并且没有与该代码关联的源代码。但是,假设您真的想要一些与您为调用站点生成的表达式树相关联的单步执行内容。为此,您需要做两件事。首先是将调试信息存储在表达式树中——你可以使用 DebugInfoExpression .接下来是将方法编译为可调试方法并将该委托(delegate)提供给 DLR。

    编译你需要使用的方法 LambdaExpression<T>.CompileToMethod . MethodBuilder您需要提供的静态方法必须是在您之前创建的可调试程序集中的类型中定义的静态方法。

    要将该委托(delegate)提供给 DLR,您有两种选择。可能最简单的方法是实际返回一个调用已编译的可调试委托(delegate)的表达式(只需通过常量保持它)。更难但在某些方面更优雅的方法是覆盖 BindDelegate<T>在调用站点上并返回已编译的委托(delegate)。这开始创建适当的参数 Expression s 并调用 Bind*方法来生成你自己的表达式树。

    所有这些都在 DLR 外层/IronPython/IronRuby 中完成——所有这些都可以在 ironpython.codeplex.com 获得.你可以看看 CompilerHelpers.CompileToMethod作为编译的示例, Snippets类(以及相关的 AssemblyGen/ TypeGen/ ILGen 类,用于创建可调试程序集,甚至 DLR 表达式树编译器(在 Runtime\Microsoft.Scripting.Core\Compiler 中)作为发出行信息的示例。

    关于compiler-construction - 使 CLR/.NET 语言可调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4357420/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com