与.NET2.1部署的调试代码相比,发布代码的调试难度有多大?

与.NET2.1部署的调试代码相比,发布代码的调试难度有多大?,.net,remote-debugging,.net,Remote Debugging,作为迁移到另一个云提供商的一部分,我们发现需要能够在Kubernetes pod(运行在mcr.microsoft.com/dotnet/core/aspnet:2.1上)中调试我们的.NET 2.1应用程序,我被指派去研究它 我们的CI引擎目前使用“-c版本”进行构建,但我注意到以下措辞: 对于调试,有两个重要的注意事项。首先,这要困难得多 调试零售编译代码要比调试编译代码好,所以 强烈建议使用“调试”配置。如果你真的需要 使用“释放”配置,确保禁用 工具->选项->调试->仅我的代码 我使用

作为迁移到另一个云提供商的一部分,我们发现需要能够在Kubernetes pod(运行在mcr.microsoft.com/dotnet/core/aspnet:2.1上)中调试我们的.NET 2.1应用程序,我被指派去研究它

我们的CI引擎目前使用“-c版本”进行构建,但我注意到以下措辞:

对于调试,有两个重要的注意事项。首先,这要困难得多 调试零售编译代码要比调试编译代码好,所以 强烈建议使用“调试”配置。如果你真的需要 使用“释放”配置,确保禁用 工具->选项->调试->仅我的代码

我使用Java的时间比我想的要长(大部分优化都发生在运行时的JVM中),但我不熟悉.NET,所以我想知道为什么版本编译的代码更难调试


这仅仅是因为编译器执行了一些常见的技巧,比如展开循环、计算字符串表达式等等,还是因为有更深层次的转换在幕后发生?(如我所读到的,英特尔C++编译器可以交换两个循环,如果这意味着数组遍历在它们中发生在一个更高速缓存有效的事情中)

代码,在<代码>版本> />代码配置下编译,有很多优化,这在代码>调试/代码>配置上不存在。查看现有线程,如或,以获取一些详细信息。JVM之类的工作是在运行时执行的。工具>选项>调试>常规,确保“在模块加载时抑制JIT优化”处于启用状态。这将考虑到优化带来的随机性。但是调试信息文件(the.pdb)仍然存在问题,发布版本通常配置为删除源文件和行号信息。当然,强烈建议您自己构建项目,而不是使用CI构建。