【问题标题】:Is it possible to debug code compiled at runtime?是否可以调试在运行时编译的代码?
【发布时间】:2011-04-08 13:35:48
【问题描述】:

我需要使用CodeDomProvider.CompileAssemblyFromSource 编译一些代码。如何调试它?基本上,我想编译它,创建一个类型的实例,然后单步执行该类型的代码。

【问题讨论】:

  • “内存选项”是什么意思?您是否尝试过简单地将调试器附加到正在运行的进程?
  • 虽然这可能不是您想要的,但仅出于调试目的而将程序集生成到磁盘并将其加载到现有程序集的位置怎么样?我理解在运行时生成程序集的必要性,但是选择某些运行时条件并在编译时重现它们并没有错:)

标签: c# .net visual-studio-2010 compiler-construction codedom


【解决方案1】:

发布问题后,我意识到我的问题是我是从字符串生成程序集,而不是从文件生成程序集。在 DEBUG 中,我返回并更改了代码以使用不同的选项运行,并且我能够直接从单元测试代码中介入。还必须将 GenerateInMemory 设置为 false 并将 IncludeDebugInformation 设置为 true。

#if DEBUG
            @params.IncludeDebugInformation = compilationContext.IncludeDebugInformation;
            @params.GenerateInMemory = compilationContext.GenerateInMemory;
            var fileName = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory,@"..\..\" + compilationContext.AssemblyOutputName + ".cs"));
            File.WriteAllText(fileName,compilationContext.StringToCompile);
            return _codeDomProvider.CompileAssemblyFromFile(@params,fileName);
#else
            return _codeDomProvider.CompileAssemblyFromSource(@params, compilationContext.StringToCompile);
#endif

【讨论】:

  • 有趣的观察,像这样生成的程序集不必以 dll 结尾才能使用,它根本不必有任何扩展名。
  • +1 很好的问题和自我回答,非常适合我。我正在即时生成和编译测试代码。这很有用。
  • @Wilkins:谢谢,很高兴它帮助了其他人。我的东西更复杂一些,我生成的代码会生成代码,然后编译和执行。所以能够调试对我来说是必须的。
【解决方案2】:

有趣的问题。我认为您最好的选择是使用WinDbg 附加到正在运行的.NET exe 进程(我认为您必须在 tyoe 在内存中编译后执行此操作,因为 EXE 的内存地址会改变 - 我假设)。

然后,当该类型被编译并在内存中运行时,您可以使用 SOS.dll 中的命令搜索该类型。您还可以使用 SOS.dll 在内存中放置断点

开始使用 SOS 链接

http://rionisimpsoni.wordpress.com/2009/10/08/getting-started-with-windbg-and-sos-dll/

这是一个简单的答案,因为解释如何使用 WinDbg 和 SOS.dll 已经在网上多次介绍过。

编辑:

此方法的一个缺点是您将无法像 Visual Studio 显示的那样看到源代码。当您单步执行代码时,您将看到显示的汇编语言。这可能已经让你望而却步了 :),但如果你坚持下去,并且了解一点汇编,你可以做足够的工作来调试错误。

您可以做的另一件事是将 .NET 程序集从内存转储到磁盘上的文件中。执行此操作的 SOS.dll 命令现在逃脱了我,我会去找它...

啊,我是SaveModule。这方面的一个例子可以在 cmets here 中找到。

【讨论】:

    【解决方案3】:

    您是否尝试使用 VS 中的“调试”>“附加到进程”功能中的代码附加到进程?

    【讨论】:

      猜你喜欢
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-15
      • 2013-05-30
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多