【问题标题】:Can I prevent the CLR from optimizing away debugging information?我可以阻止 CLR 优化调试信息吗?
【发布时间】:2010-11-06 22:57:29
【问题描述】:

我为单元测试编写了一个抽象基类,它为我们的测试运行设置了足够的环境。该类将一些运行时环境位公开为属性,其类型因测试而异(属性类型是在继承的具体测试类中指定的类型参数)。

这一切都很好,除了一位同事注意到他无法在调试器中查看任何类的属性。原来原因是他的继承类中没有定义字段,并且 CLR 优化了某些东西或其他东西,所以调试器无法显示属性。是否有可能在基类中以某种方式防止这种情况,还是我必须诉诸于告诉所有人他们需要定义至少一个在测试期间某处使用的字段?

编辑:

听起来可能的罪魁祸首应该是优化/调试设置。也就是说,我在调试模式下从 Visual Studio 构建应用程序,我已经仔细检查了所有项目是否都设置为调试构建,并且此解决方案中的所有项目都没有设置优化标志。

也许还需要注意我正在使用 MSTest 和 Visual Studio 测试运行程序。

编辑 2:

当我在 Quickwatch 中评估属性并获得红色感叹号和文本“无法评估表达式”错误文本时,我指的是“无法查看属性”。为了避免你认为我的怀疑完全偏离了基础,添加一个在测试初始化​​方法中初始化的实例字段会使问题消失......

编辑 3:

检查了构建输出。我注意到编译器是使用这些选项调用的:

/debug+
/debug:full
/optimize-
/define:DEBUG,TRACE

我应该认为这足以阻止这种情况发生,但是你去吧。 :)

【问题讨论】:

  • 如果您进行调试构建会发生什么?
  • 嗯...这听起来很奇怪。您能否提供一个简短但完整的测试程序来演示它?
  • @John Saunders:正是我所描述的。
  • @Rytmis:这就是我认为您正在查看发布版本的原因。否则有人在调试构建期间将其设置为优化。 C# 在任何情况下都不会做太多优化。在调试版本中优化某些东西似乎不太可能 - 因此我怀疑您没有在查看调试版本。
  • 好吧,我会被诅咒的。我能想到的最简单的测试用例没有表现出这种行为。 :(

标签: c# .net optimization clr debugging


【解决方案1】:

我以前也遇到过同样的问题,这总是由于调试模式已以某种方式关闭。尝试检查以下各项:

  1. 解决方案和相应项目的当前构建配置是Debug
  2. 在属性页的构建选项卡中,优化代码复选框未选中

如果这一切都正确,那么我建议您将写入 Output 窗口的文本粘贴到此处,以便我们可以发现任何更不寻常的问题原因。

【讨论】:

  • 这听起来很可能,但活动配置是调试的,配置对所有项目都显示“调试”,并且未设置类所在程序集的“优化”标志。不幸的是,我实际上无法在此处粘贴任何内容(不同的机器),也不允许这样做。我应该寻找什么具体的东西?
  • @Rytmis:您能否澄清一下“他无法查看任何班级的属性”的意思。您是否正在使用手表/只是用鼠标将鼠标悬停在变量名称上?有消息吗?关于构建输出,我只是在寻找任何异常。既然您已经提到这是 MSTest,但我开始认为问题是特定于它的。
  • 在问题描述中添加了说明:当我打开 Quickwatch 并输入属性名称时,我得到“无法评估表达式”。当我将实例字段添加到继承类(正在调试的类)时,这个问题就消失了。
  • @Rytmis:您能否确认您是否在正常调试时遇到了同样的问题(而不是使用 MSTest)?
  • 我没有再遇到这种情况了,所以我假设我在更改这些设置后在重建中搞砸了一些东西。 :)
【解决方案2】:

确保您没有尝试调试您的发布版本。 所有这些编译设置都设置在这些配置后面。 调试版本是用于调试的版本;-)

【讨论】:

    【解决方案3】:

    在我的例子中,项目配置是正确的,但我的代码是从 ILSpy 反编译的结果,它具有如下程序集属性:

    [assembly: CompilationRelaxations(8)]
    [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
    [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
    

    删除这些属性修复了调试器...

    【讨论】:

      猜你喜欢
      • 2019-06-17
      • 2010-09-11
      • 2018-01-12
      • 2021-12-20
      • 1970-01-01
      • 2012-08-23
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多