我可以阻止CLR优化掉调试信息吗?

时间:2009-06-30 09:33:45

标签: c# .net optimization clr debugging

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

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

编辑:

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

也许有必要注意我正在使用MSTest和Visual Studio测试运行器。

编辑2:

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

编辑3:

检查构建输出。我注意到使用以下选项调用编译器:

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

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

3 个答案:

答案 0 :(得分:7)

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

  1. 解决方案和适当项目的当前构建配置是 Debug
  2. 在属性页的 Build 标签中,优化代码复选框未选中
  3. 如果这一切都正确,那么我建议您将写入输出窗口的文本粘贴到此处,以便我们可以发现问题的任何不寻常原因。

答案 1 :(得分:2)

Dont Forget the obvious

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

答案 2 :(得分:0)

对于我来说,项目配置是正确的,但是我的代码是从ILSpy反编译的结果,并且它具有如下所示的程序集属性:

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

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