【问题标题】:How to prevent C# compiler/CLR from optimizing away unused variables in DEBUG builds?如何防止 C# 编译器/CLR 优化 DEBUG 构建中未使用的变量?
【发布时间】:2011-10-20 06:30:47
【问题描述】:

在调试时,我尝试将计算的中间结果保存到变量中,以便在满足断点条件时检查该值。然而,C# 编译器(或 CLR)将该变量优化为未使用。我通过将变量设为类的公共字段解决了这个问题,但是我想知道是否有一个直接的解决方案来解决这个问题。

“优化代码”复选框未选中。构建配置为 Debug。

编辑:发现它只影响迭代器中一些未使用的变量,这些变量通常最终会成为自动生成的迭代器类中的字段;保留在不包含 yield 语句的块内的未使用变量。

【问题讨论】:

  • 您有具体的场景吗?本地变量通常保留在调试版本中。另外:您在这里使用的是哪个编译器(确切地说)?
  • 编译器是 C# 4(VS 2010,目标框架 4.0),但是我只是做了一些测试,可以确认本地变量保留在调试版本中,但迭代器是我的情况。
  • "iterators" 是我们当时遗漏的关键细节……事实上,它们经历了大规模的重写;我怀疑添加 WriteLine 之类的内容是通过修改过程保留它们的最佳方式
  • 是的,但不可能从一开始就提供所有相关细节,因为通常不清楚哪些细节是相关的。您的 cmets 确实为我指明了正确的方向。
  • 对于信息,你想不到它;p i.stack.imgur.com/E73Uz.png

标签: c# debugging


【解决方案1】:

惰性选项是......使用该值,理想情况下以不允许将其保留在堆栈上的方式。例如:

 var tmp = SomeMethod();
 // your other code
 Debug.WriteLine(tmp);

将该值用作参数意味着它必须保留,但该行不会自动编译到发布版本中。

但是!我必须强调,本地人几乎总是保留在未优化/调试的构建中,所以我发现问题中的场景很难想象。

【讨论】:

    【解决方案2】:

    如果您使用的是 Visual Studio,为什么不在进行计算的行之后的行上添加一个断点,然后您只需将鼠标悬停在计算上即可在智能感知/工具提示弹出窗口中查看结果?我还认为您可以将计算添加到“监视”屏幕并以这种方式查看结果。

    这通常是我查看调试结果的方式。或者,您可以使用您以某种简单方式创建的临时变量来避免收到警告。

    例如:

    Console.Write(tempVariable);
    

    【讨论】:

    • Console 的一个缺点是如果您忘记删除它,它将保留在发布版本中。
    • 我不能提前设置断点,因为断点是有条件的,条件是稍后在代码中评估的。
    • @MarcGravell 我同意,这就是为什么我建议首先使用断点。我猜如果他选择使用实际使用 temp 变量的解决方案,那么您的方式(使用 Debug)是一个更好的选择。
    • @srgstm 我真的不明白您为什么无法设置断点。你试过这样做吗?也许如果您发布一段代码,我可以提供更多帮助......
    • @giygas73 他没想到;场景(见 cmets)是一个迭代器块:i.stack.imgur.com/E73Uz.png
    【解决方案3】:

    实用工具:

    using static _globals;
    
    static class _globals
    {
        [MethodImpl(MethodImplOptions.NoInlining), DebuggerHidden]
        public static void Nop<T>(out T x) => x = default(T);
    };
    
    class Program
    {
        static void Main()
        {
            int i;     // unreferenced variable
    
            /// ...
    
            Nop(out i);
    
            /// ...
        }
    };
    

    【讨论】:

    • 您正在将变量设置为其默认值,因此应该调用它,例如SetDefault(),不是Nop()。
    【解决方案4】:

    您需要在调试构建的项目选项中取消选中“优化代码”选项。

    【讨论】:

    • 来自问题:“优化代码”复选框未选中。构建配置为 Debug。
    • 在我回答之后添加了一点。
    • 您可以看到我没有编辑问题。这句话从一开始就存在。
    • @srgstm 实际上,我们看不到 - 有 5 分钟的宽限期不会跟踪编辑
    【解决方案5】:

    在我的情况下,“优化代码”选项未被选中,但我仍然面临这个问题。我检查了它,构建项目然后取消选中它并再次构建项目。为我解决了这个问题。

    【讨论】:

    • 我检查,保存解决方案,取消检查,然后再次保存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多