我应该在.net中使用Debug类吗?

时间:2009-07-09 15:44:50

标签: .net debugging boilerplate

我最近一直在阅读Debug class的很多内容。

我个人很沮丧。我可以看到它改进了创建真正棘手的算法的过程。但它也为我的应用程序添加了许多代码,我必须不必要地跋涉。有一个调试器应该不需要锅炉板代码,无论是自动剥离版本还是不正确?

我也很感兴趣那些能够很好地使用Debug类的人如何做到这一点。您是否编写了Debug.Assert语句,或者您{(3}}是否应该使用Debug.WriteLine和Debug.Fail。

8 个答案:

答案 0 :(得分:3)

我个人同意Ed Kaim的观点。就个人而言,我觉得好的测试实践在我的所有工作中都取代了Debug.Assert调用。另外,我几乎放弃了对Debug.Fail的使用 - 任何时候我想使用它,我几乎发现我想在发布和调试中抛出异常,所以我通常不会看到重点。

话虽这么说,我仍然使用一些调试打印语句来增强我的调试(通过Debug.WriteLine),特别是在数字代码中...我承认这是对旧式printf调试的回归,但经常,这仍然是追踪问题的最快方法,尤其是在调试器中没有显示的问题(由于时序问题,线程等)。

答案 1 :(得分:2)

就个人而言,我很少使用Debug类来完成任何编程。我已经阅读了很多评论和建议,例如John Robbins(Debugging .NET 2.0 Applications的作者和Bugslayer专栏)关于为什么要主动断言 - 尤其是方法的参数。

我遇到的问题就是这样 - 说我要编写这样的代码:

Public Sub Test(source As Object)

  Debug.Assert(source IsNot Nothing, "source is Nothing")

  ' Do something....
End Sub

这在使用调试版本进行开发期间效果很好,但我最终还是这样做了:

Public Sub Test(source As Object)

  If source IsNot Nothing Then

  ' Do something....

  End If
End Sub

如果'源'有可能什么都没有,那么无论如何我都会对它进行'If'检查。我不会在发布版本中留下断言调用。

我不使用Debug类的另一个原因是我编写了很多单元测试。这样做使我覆盖了很多代码路径,因此在我的代码中不需要Debug.Assert。

对于调试日志记录,我只是使用Trace调用和SysInternals DebugView或文本文件来记录跟踪调用的输出。

我很想听听其他人关于这个话题,因为我也有兴趣了解他们在开发过程中如何使用Debug类。这是一个我没有太多经验的领域,所以我很想学习。

答案 2 :(得分:1)

使用Debug类而不是在调试器中运行代码的主要优点是您获得了一个日志文件(使用Debug.Writeline语句),您可以与同事/商店共享您的记录。

Debug.Assert相对于编写单独的测试方法的优点是紧凑性,以及检查正好在它需要的位置,而不是单独的方法。

答案 3 :(得分:1)

我自己的观点是Debug.Assert和Debug.Fail经常被误用来“隐藏”最终用户的错误。我宁可写一个错误日志,如果有保证也会抛出异常。

答案 4 :(得分:1)

我不能告诉你你是否应该,但我可以建议我使用它的时间。

当我想要有关函数/变量/进程/结果的更多信息时,我使用Debug但是我知道一旦它被释放,信息就不再相关了。我使用Debug.Writeline来验证进程的正确年表,例如,或使用Debug.Assert来验证值是否应该是。

我认为Kaim只是说滥用Debug.Assert很容易。不要使用Debug.Assert来捕获生产中可能发生的问题。 Debug.Assert用于在开发期间进行简单检查,例如提醒标志。它并不意味着处理发布代码错误。您可以在每个其他行放置一个Debug.Assert,而不必担心它会降低发布代码的速度。

答案 5 :(得分:1)

我建议不要使用Debug课程;我不。一般来说,我发现调试器足以满足我的所有需求;以及我真正需要跟踪的内容,我记录了。关于日志记录的最关键部分是日志记录也出现在生产代码中,这非常重要。根据定义,Debug仅在调试代码中起作用;虽然它可能对帮助您在开发过程中找到某些内容很有用,但如果查找它很重要,请记录它。认真。如果找到并且非常棘手,你需要一个特殊的设施才能找到它,请记录下来;它可能会作为边缘情况出现在您的生产环境中,那么您会做什么?

对于它的价值,我发现log4net对于日志记录来说非常有用和强大。我推荐它可以在任何一天使用Debug课程。

答案 6 :(得分:0)

我们经常使用Debug.Assert - 对于每一个重要的假设,你会认为它有一个断言没有坏处。

相当有用但旧的文章 - IDesign C#编码标准here

答案 7 :(得分:0)

Debug.Assert测试合同。它有一点好处,它在发布代码中不存在。 if +抛出异常情况并非如此。

我将Debug.WriteLine用于UI事件,因为调试器会妨碍(例如,从VS窗口切换到应用程序窗口时会再次调用刷新事件)。