是否可以调试在运行时编译的代码

本文关键字:编译 代码 运行时 调试 是否 | 更新日期: 2023-09-27 17:49:42

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

是否可以调试在运行时编译的代码

在我发布了一个问题之后,我意识到我的问题是我从字符串生成程序集,而不是从文件。我回去改变了代码,在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

有趣的问题。我认为你最好的选择是使用WinDbg附加到正在运行的。net exe进程(我认为你必须在类型在内存中编译后这样做,因为exe的内存地址会改变-我假设)。

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

在内存中设置断点

SOS入门link

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

这是一个简单的答案,因为如何使用WinDbg和SOS.dll已经在网上讨论过很多次了。

编辑:

这个方法的一个缺点是你不能像Visual Studio那样看到源代码。在逐步执行代码时,您将看到汇编语言的显示。这可能已经让您感到厌烦了:),但是如果您坚持使用它,并且了解一些汇编,您可以做足够的事情来调试错误,例如

您可以做的另一件事是将. net程序集从内存转储到磁盘上的文件中。这个SOS.dll命令现在逃开了,我要去找它…

啊,是SaveModule。这方面的一个例子可以在这里的评论中找到。

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