调试太挫了,你应该使用日志。
如果你的代码是结构化的,根本不需要通过日志来进行调试。
这是两种截然相反的态度。一般来说,我都是持中庸的立场,下面我来说下原因。
首先使用日志还是调试没有本质的区别。这只不过是同一件事情的两种实现方式:以时间为维度来观察执行引擎的状态。
调试存在的问题
调试的时候你可以逐步前进,在任意一个暂停的执行点,你都可以观察到所有变量的值。它的缺点就是无法回退到前面的某个时间点。有的时候你突然意识到你想看下刚发生的某个方法调用 ,或者对象创建,又或者别的什么之前的某个变量的值 。这种情况下你只能重新运行代码了,还得期望它能正好走到刚才那个分支上,然后在前面的感兴趣的某个点拦截住。这也是调试的另一个缺点。如果你的代码的行为不确定的话,你很难进行调试。相信我:绝大多数BUG的行为都是不确定的。
日志存在的问题
日志的问题就不大一样了。时间这块不是问题,问题在于你要观察的状态和变量实在是太多了。你在代码中的某个执行点插入日志语句,把变量的值输出到日志文件中。当你检查日志文件的时候,可以随意地上下滚动。不过如果你没有在某个执行点打印出某个变量的值的话,日志文件对此就束手无策了。它的解决方案和调试一样:重新执行一遍,记得这次要加上一段新的日志语句。不过,如果你的日志文件中的信息足够详细的话,就算这个BUG是不确定的,你也有足够的信息来对它进行跟踪。不过,我们刚才说的是"如果"。
解决方案:记录所有变量的值?
理想的状态是在每次执行的时候都将所有变量的值输出到一个日志文件中,这样后面你就可以查看这个文件的内容了。这个查看过程有点像一个调试器,不同的是变量的变化是源自你记录的日志文件,而不是实时的运算。它就像在回放一段录制好的执行过程,你可以不停地回放它。我不知道JVM是不是也有类似的工具。
在多线程的执行环境下,就比如说像JVM这样,你根本没法定义什么是每一个状态,这是一个问题。还有一个问题是,如果每条指令你都dump一下JVM的内存(先不考虑多线程的事),这会消耗巨大的带宽及磁盘资源。
做白日梦是没有任何意义的。有什么实际能用的解决方案呢?
实际的方案
在合适的时候你可以使用调试。如果你一直都是用调试的话,那就继续吧。我个人倾向于使用日志,尽管有的时候环境允许我进行实时的调试。当我找到我在苦苦追寻的问题的原因后,我会检查一遍记录日志的语句,然后删掉它们。它们已经完成了自己调试的使命,现在已经不再需要它们了。不过后来我发现,我自己在写一些以前删掉过的日志记录的语句,至少我自己是有这样的经历。为什么呢?这是因为修复一个BUG并不意味着所有的BUG都修复了。BUG是永远也改不完的。但是散落在文件各处的日志记录给查找下一个BUG的相关信息增加了难度。换句话说,日志文件中的干扰信息太多了,这就是为什么我删掉它们的原因。那同样的,我们是不是可以把已经通过的单元测试也给删掉呢?这会节省掉很多编译的时间,不是吗?当然,我们不会这么做。
用一句话来总结下?选择日志还是调试,随你个人的喜好吧,也得看你在查找什么类型的问题。
译注: 文章已经结束了。但是文章后边有条评论非常有意思,注意,本文只有一条评论,而且署名是作者本人。
很感谢你指出了这个问题,在某些特殊的情况下,你或许可以对产品进行调试,但一般来说那都不是最佳的方式。
[我还没有蠢到自己回复自己的文章来感谢自己。这是在回复一条之前删除过的评论,很可能是评论者自己删除的,他当然有权利这么做。不过这让我的这条评论显得很傻。原来的那条评论是说,你无法在生产环境进行调试。]
译注:我强烈的感觉到,作者应该是个处女座。算了,不黑他了。
原创文章转载请注明出处:
http://it.deepinmind.com
英文原文链接
分享到:
相关推荐
本文将详细讲解如何通过调试运行日志程序来输出调试信息,以及如何利用类CLog实现这一功能。 首先,让我们理解什么是调试信息。在软件开发中,调试信息是用于帮助开发者理解代码执行过程的详细数据。这些信息通常...
至于压缩包中的“简历”文件,它可能是一个开发者上传的个人简历,与日志调试的主题直接关联性不大,但可以反映出博主可能在寻找与日志处理、调试技术相关的工作机会。在面试或工作中,具备良好的日志处理能力对任何...
功能:输出日志信息logfile.h VC日志类调试信息输出,是编程调式跟踪流程的日志输出好帮手,很有助于程序的排错调试.1,使用简单方便.只有一个头文件logfile.h include后,直接调用函数即可2,VC6,VC7(VS系列,VS2008) 兼容...
在C++编程中,日志调试打印是一项至关重要的任务,它可以帮助开发者跟踪代码执行过程,定位和解决问题。本文将深入探讨C++中的日志调试打印技术,包括基本概念、实现方式以及最佳实践。 首先,日志是程序运行过程中...
6. **VS.NET Debug-log for Debug(1)**:这个文件名可能是Visual Studio .NET的一个日志调试教程,其中可能包含了如何在VS.NET环境中使用日志辅助调试的详细步骤,包括如何配置日志输出,如何在代码中插入日志语句,...
这意味着无论你是在维护旧项目还是在使用最新工具,都能够无缝地利用这个强大的日志功能。这种广泛的兼容性体现了作者对不同开发环境的深刻理解以及对用户需求的细致考虑。 再者,该日志类的一个亮点是能够输出...
标题中的"Caffe怎么单步调试?"是指在开发或优化Caffe深度学习框架时,如何进行源代码级别的调试,以理解和解决可能出现的问题。Caffe是一个高效、模块化的深度学习库,广泛应用于计算机视觉和机器学习任务。对于...
### iOS WiFi调试日志抓取知识点详解 #### 一、问题背景及应用场景 在iOS设备上遇到Wi-Fi连接问题时,通常需要收集一系列的日志文件以便进行深入分析和故障排除。这些日志包括但不限于Wi-Fi日志、设备控制台日志...
在IT行业中,打印调试日志是一项至关重要的任务,它对于软件开发、问题排查以及系统维护具有举足轻重的作用。日志系统是软件应用程序中一个不可或缺的组件,它记录了程序运行过程中的各种事件和状态,帮助开发者追踪...
根据提供的标题、描述及部分代码内容,我们可以深入探讨关于“调试日志调试”的几个关键知识点。 ### 调试日志的基本概念 调试日志(Debug Logging)是指在软件开发过程中记录下来的有关程序运行状态的信息,通常...
在安卓开发过程中,调试是必不可少的一个环节,而日志(Log)则是开发者了解应用程序运行状态的重要工具。Android Debug Bridge(ADB)是Google提供的一款强大的命令行工具,它允许开发者通过USB或网络连接来与...
在IT行业中,日志(log)是开发和调试过程中不可或缺的一部分。日志系统,如“hlog”,是用来记录应用程序运行时的各种事件、错误、警告和信息的重要工具。它为开发者提供了一种跟踪程序行为,诊断问题,以及优化...
无论是在移动设备(如Android和iOS)还是桌面平台(如Windows),甚至在浏览器中运行的WebGL和Web Player项目,开发者都可以利用SRDebugger进行实时的日志调试。 2. **性能优化**:对于资源有限的移动设备而言,...
在IT行业中,日志记录是调试和监控程序运行状态的关键工具。"多线程调试打印日志类"是一个专门设计用于在多线程环境中记录和打印日志的C++类。此类实现了一个单例模式,确保在整个应用程序中只有一个实例存在,从而...
### 解决华为系列手机调试时不能打印Logcat日志信息 在进行Android应用开发的过程中,开发者经常需要通过Logcat(Log Catcher)工具来获取应用运行时的日志信息,这对于定位问题、调试程序有着至关重要的作用。然而...
《网口调试助手-中文日志功能版》是一款专为网络接口调试设计的实用工具,旨在简化和优化网络设备的调试过程。...无论是对网络工程师还是对普通用户,这款软件都能提供有效的支持,是网络调试工作中的得力助手。
总的来说,这个压缩包提供的资源是一个实用的日志调试工具,结合了C语言和VB的优势,使用内存共享技术实现跨环境的日志记录,并具有灵活的等级管理和可视化展示,对于开发者来说,无论是学习还是实际工作,都是一个...
标题提到的"多线程调试日志记录类"是专为解决这类问题而设计的。这个类可能包含以下关键知识点: 1. **多线程**:多线程编程允许应用程序同时执行多个任务,提高资源利用率和程序响应速度。但在多线程环境中,同步...
容易产生以为日志只能输出到文本文件,其实安装了日志钩子以后,拿到了所有调试打印信息,你完全可以用来存储到数据库+html有颜色区分格式的文件+网络转发输出(尤其适用于嵌入式linux无界面程序,现场不方便外接...