【问题标题】:How to avoid debugger-only variables?如何避免仅调试器的变量?
【发布时间】:2009-11-19 04:16:50
【问题描述】:

我通常将赋值后只使用一次的值放入变量中。我这样做是为了让以后的调试更方便,因为我可以将值悬停在以后使用它的一行上。

例如,此代码不允许您悬停 GetFoo() 的值:

return GetFoo();

但是这段代码可以:

var foo = GetFoo();
return foo; // your hover-foo is great

这闻起来很 YAGNI-esque,因为 foo 的任务的 功能 直到有人才会使用需要调试它的值,这可能永远不会发生。如果不是为了仅仅预见调试会话,上面的第一个代码 sn-p 使代码更简单。

您将如何编写代码以在简单性和调试器易用性之间取得最佳折衷?

【问题讨论】:

    标签: debugging refactoring yagni


    【解决方案1】:

    我不知道其他调试器,但是集成的 Visual Studio 调试器会在“自动”窗口中报告从函数返回的内容;一旦你越过 return 语句,返回值就会显示为“[function name] returned”,其值是返回的任何值。

    gdb 也支持相同的功能; “完成”命令执行当前函数的其余部分并打印返回值。

    这是一个非常有用的功能,如果大多数其他调试器支持此功能,我会感到惊讶。

    至于“仅限调试器的变量”这个更普遍的“问题”,它们真的只有调试器吗?我倾向于认为使用命名良好的临时变量也可以显着提高代码的可读性。

    【讨论】:

    • 很好的提示。谢谢你。 'return' 的例子就是这样——只有一个例子……当我这样做的时候。但是,该工具(例如 IDE)可以给我所需的信息而不必编写仅用于调试的代码的次数越多……我编写仅用于调试的代码就越少!
    • 哦,这就是 Autos 的用途!!!!天哪,我们需要一份所有已发布的 Visual Studio 调试工具的指南……
    • “自动”技术适用于 C++,不适用于 C#。见stackoverflow.com/questions/268048/…
    • 显然它只适用于本机 C++,根本不适用于 .NET 代码(参见stackoverflow.com/questions/591086/…)。 叹息
    【解决方案2】:

    另一种可能性是学习足够的汇编编程,您可以阅读编译器生成的代码。借助该技能,您可以确定值的保存位置(在寄存器中、内存中)并查看该值,而无需将其存储在变量中。

    如果您需要调试优化的可执行文件,此技能非常有用。优化器可以生成与您编写的方式截然不同的代码,因此符号调试无济于事。

    【讨论】:

      【解决方案3】:

      在 Visual Studio 调试器中不需要中间变量的另一个原因是,您可以在 Watch Window 和 Immediate 窗口中计算函数。对于监视窗口,只需突出显示要评估的语句并将其拖到窗口中即可。

      【讨论】:

        【解决方案4】:

        我认为这不值得担心。鉴于在典型情况下没有运行时开销,请发疯。我认为将复杂语句分解为多个简单语句通常会增加可读性。

        【讨论】:

          【解决方案5】:

          我会省略任务直到需要它。如果您从未碰巧在那段代码中,想要查看该变量,那么您就没有不必要地弄乱您的代码。当你遇到需求时,把它放进去(它应该是一个微不足道的 Extract Variable 重构)。完成该调试会话后,将其删除(内联变量)。如果你发现自己调试太多——而且在那个特定的点上——你已经厌倦了来回重构,那么想想避免这种需要的方法;也许更多的单元测试会有所帮助。

          【讨论】:

            猜你喜欢
            • 2015-10-04
            • 2015-02-19
            • 1970-01-01
            • 1970-01-01
            • 2020-10-02
            • 2010-12-22
            • 2015-09-15
            • 2011-03-24
            • 1970-01-01
            相关资源
            最近更新 更多