Debugging 如何保留自己的调试行而不签入它们?

Debugging 如何保留自己的调试行而不签入它们?,debugging,version-control,logging,Debugging,Version Control,Logging,在处理某些代码时,我添加了一些额外的调试日志记录,以便更容易跟踪我关心的特定修复的状态和值 但是,如果我将其签入源代码存储库,我的同事会因为我污染了日志输出和代码而生气 那么,我如何在本地保留这些对我来说很重要的代码行,而不将它们签入 澄清: 许多答案都与日志输出有关,您可以使用日志级别筛选出这些答案。我同意这一点 但是。我还提到了污染实际代码的问题。如果有人在每隔一行代码之间放置一条log语句,则可以一直打印所有变量的值。这确实使代码难以阅读。所以我也希望避免这种情况。基本上,根本不检查日志代

在处理某些代码时,我添加了一些额外的调试日志记录,以便更容易跟踪我关心的特定修复的状态和值

但是,如果我将其签入源代码存储库,我的同事会因为我污染了日志输出和代码而生气

那么,我如何在本地保留这些对我来说很重要的代码行,而不将它们签入

澄清: 许多答案都与日志输出有关,您可以使用日志级别筛选出这些答案。我同意这一点


但是。我还提到了污染实际代码的问题。如果有人在每隔一行代码之间放置一条log语句,则可以一直打印所有变量的值。这确实使代码难以阅读。所以我也希望避免这种情况。基本上,根本不检查日志代码。所以问题是:如何保留自己的专用日志行。因此,您可以在调试版本中使用它们,而不会使签入代码变得混乱。

您使用的是什么源代码管理系统?Git允许您保留本地分支。如果情况更糟,您可以在存储库中创建自己的“Andreas”分支,尽管分支管理可能会变得非常痛苦

但是如果我能把这个登记进 源代码存储库,我的同事们 你会因为我污染环境而生气吗 日志输出和代码


我希望您的日志框架具有日志级别的概念,以便可以轻松地关闭调试。就我个人而言,我不明白为什么人们会对更多的调试日志感到愤怒——因为他们可以直接关闭它

为什么不将它们包装在预处理器指令中(假设构造以您选择的语言存在)

此外,您还可以使用跟踪或调试之类的日志级别,这在生产中不应启用

if(logger.isTraceEnabled()) {
    logger.log("My expensive logging operation");
}
这样,如果某一天该领域出现了一些问题,您可以重新打开该级别的日志记录,并获得一些(希望)有用的反馈。
请注意,这两种解决方案仍然允许签入日志语句,但我认为没有理由不签入它们。我正在提供解决方案,使它们不出现在生产日志中。

类似于

#if DEBUG #endif....
但这仍然意味着任何使用“调试”配置运行的人都会遇到这些问题

如果您真的希望跳过它们,那么请使用其他人不使用的日志级别,或者

创建另一个名为MYDEBUGCONFIG的运行配置 然后将调试代码放在块之间,如下所示:

#if MYDEBUGCONFIG 
...your debugging code
#endif;

如果这真的是一个持续存在的问题,我想我会假设中央存储库是主版本,最终我会使用补丁文件来包含官方版本(我最后一次使用的版本)和我的调试代码版本之间的差异。然后,当我需要恢复调试时,我会签出正式版本,应用我的补丁(使用
patch
命令),修复问题,在签入之前,使用
patch-R
删除补丁(对于反向补丁)


然而,应该没有必要这样做。您应该能够就在官方代码行中保留信息的方法达成一致,并使用机制控制产生的调试量。不管你的语言是否有条件编译,C或C++都是有条件的,C预处理器。

如果你真的在做这样的事情:

放入日志语句 在每隔一行代码之间 打印所有变量的值 时间。这真的使代码 难以阅读

这就是问题所在。请考虑使用测试框架,并在其中编写调试代码。
另一方面,如果您只编写了几行调试代码,那么您可以手动避免这些代码(例如,在提交之前使用编辑器删除相关代码行,并在完成更改之后撤消这些代码行)-但当然,这必须是非常罕见的

我知道我会因此得到反对票…
但如果我是你的话,我会建立自己的工具

这将花费你一个周末的时间,是的,但是你会保持你的编码风格,你的存储库干净,每个人都会很高兴

不确定您使用的源代码管理。有了我的,你们可以很容易地得到一个“待签入”的列表。您可以通过API触发提交

如果我有同样的需求,我会制作一个要提交的程序,而不是使用源代码管理GUI中的内置命令。您的程序将遍历挂起的内容列表,获取您添加/更改的所有文件,制作它们的副本,删除所有日志行,提交,然后用您的版本替换它们

根据日志行的外观,您可能需要在它们的末尾添加特殊注释,以便程序识别它们

再说一次,不要做太多的工作,以后使用也不会太痛苦。

我不希望你会发现一些已经为你做过的事情(以及你的源代码管理),我认为它非常具体。

如果调试代码的唯一目标是跟踪一些变量的值,我认为你真正需要的是一个调试器。使用调试器,您可以随时查看任何变量的状态

#if MYDEBUGCONFIG 
...your debugging code
#endif;
// ##LOG-START##
logger.print("OOh A log statment");
// ##END-LOG##
logger.print("My Innane log message"); //##LOG