如何保留自己的调试行而不检查它们?

时间:2008-10-16 15:48:01

标签: debugging version-control logging

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

但是,如果我将其检入源代码存储库,我的同事会因为污染Log输出并污染代码而对我生气。

那么我如何在本地保留这些对我来说很重要的代码行,而不检查它们呢?

澄清: 许多答案与日志输出相关,并且您具有日志级别可以过滤掉它。我同意这一点。

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

10 个答案:

答案 0 :(得分:4)

如果您遇到问题的调试代码的唯一目标是跟踪某些变量的值,我认为您真正需要的是调试器。使用调试器,您可以随时观察任何变量的状态。

如果您不能使用调试器,那么您可以添加一些代码来打印某些调试输出中的值。但是这段代码应该只有几行,其目标必须是简化您正在进行的修复。一旦它被提交到trunk它就被修复了,那么你不需要更多那些调试行,所以你必须删除它们。不删除所有调试代码,良好的调试代码非常有用,只删除您的“个人”跟踪调试代码。

如果修复程序太长以至于您希望保存提交到存储库的进度,那么您需要的是分支,在此分支中您可以根据需要添加如此多的调试代码,但无论如何你应该在干线合并时将其移除。

答案 1 :(得分:3)

  

但是如果我把它检查到   源代码库,我的同事们   我会因污染而生气   记录输出并污染代码。

我希望您的Log框架具有日志级别的概念,以便您可以轻松地关闭调试。我个人不明白为什么人们会对更多的调试记录感到生气 - 因为他们可以关闭它!

答案 2 :(得分:2)

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

#if DEBUG
    logger.debug("stuff I care about");
#endif

此外,您可以使用跟踪或调试等日志级别,这不应在生产中打开。

if(logger.isTraceEnabled()) {
    logger.log("My expensive logging operation");
}

这样,如果该区域的某些事情确实在某一天出现,您可以重新开启该级别的日志记录,并实际获得一些(希望)有用的反馈。

<小时/> 请注意,这两个解决方案仍然允许签入日志记录语句,但我没有看到让它们签入的充分理由。我正在提供解决方案以防止它们停止生产日志。

答案 3 :(得分:2)

如果这确实是一个持续存在的问题,我想我会假设中央存储库是主版本,我最终会使用补丁文件来包含正式版本(我工作的最后一个版本)之间的差异on)和我的版本与调试代码。然后,当我需要恢复我的调试时,我会查看正式版本,应用我的补丁(使用patch命令),解决问题,并在签入之前删除补丁{{1} (对于反向补丁)。

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

答案 4 :(得分:2)

我知道我会为此获得负面投票...... 但如果我是你,我只是建立自己的工具。

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

不确定您使用的源控件。有了我的,您可以轻松获得“待审核”的事项列表。您可以通过API触发提交。

如果我有相同的需求,我会创建一个程序来提交,而不是使用源代码管理GUI中的内置命令。您的程序将浏览待处理事项列表,获取您添加/更改的所有文件,复制它们,删除所有日志行,提交,然后将其替换回您的版本。

根据日志行的内容,您可能需要在其末尾添加一条特殊注释,以便程序识别它们。

同样,不应该做太多工作,以后使用也不会太痛苦 我不认为你会找到适合你的东西(以及你的源代码控制),我认为它非常具体。

答案 5 :(得分:1)

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

答案 6 :(得分:1)

相似
#if DEBUG #endif....

但这仍然意味着任何使用'Debug'配置运行的人都会遇到这些行。

如果你真的希望它们被跳过,那么使用其他人没有使用的日志级别,或....

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

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

答案 7 :(得分:1)

如果你真的这样做:

  

发出日志声明   在每一行代码之间,到   打印所有变量的值   时间。它真的使代码   难以阅读。

这就是问题所在。相反,请考虑使用测试框架,并在那里编写 debug 代码。

另一方面,如果您只编写几个调试行,那么您可以设法避免这些(例如在提交之前使用编辑器删除相关行并在完成后撤消更改) - 但是当然,它必须非常罕见!

答案 8 :(得分:0)

恕我直言,你应该避免使用#if解决方案。这是执行条件调试例程的C / C ++方法。而是将所有日志记录/调试功能归为ConditionalAttribute。属性的构造函数接受一个字符串。仅当定义了与属性字符串相同名称的特定预处理器定义时,才会调用此方法。这与#if /#endif解决方案具有完全相同的运行时含义,但它在代码中看起来要好得多。

答案 9 :(得分:0)

下一个建议是疯狂不做,但你可以......

使用

等注释覆盖您的个人日志记录代码
// ##LOG-START##
logger.print("OOh A log statment");
// ##END-LOG##

在您提交代码之前,运行一个删除日志的shell脚本。

我真的不会推荐这个,因为这是一个垃圾的想法,但这绝不会阻止任何人。

另外,您也可以不在每个日志行的末尾添加注释,并让脚本删除它们......

logger.print("My Innane log message"); //##LOG

我个人认为使用具有调试日志级别等的适当日志框架应该足够好。并在提交代码之前删除任何多余的日志。