`
loseone
  • 浏览: 33108 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

调试代码是一种乐趣

阅读更多
近来连续调试了好几天的代码,乐趣无穷,:),在纯净的人和机器对话的时间中,充分的和机器不断的交流,最终共同实现功能,和同事说:“我喜爱调试代码胜过了写代码”,怎么说呢,我觉得调试代码能够充分让你将所掌握的知识发挥出来,考察自己解决问题的能力以及学习知识的能力,在这篇blog中来闲聊下调试代码。
调试代码是一种编码所需的基本能力,相信没有多少人写出来的代码能够是没有bug的,虽然传闻是有过这样的人,因此普通的我们只能通过调试代码来查找和修复代码中的问题,需要调试代码的场景有很多种,在这些场景中,也会有很多种不同的调试技巧可采用。
最典型的需要调试代码的场景是单元测试的场景,在单元测试时会碰到代码的执行不符合预期或抛出意料外的异常,在碰到抛出意料外的异常时,通常现在的高级语言都会提示是由于哪行代码造成的异常,于是首先的做法都是去看看对应的那行代码是什么个状况,然后评估大概是什么原因造成的,如果在这种推测情况下无法判断问题在哪了的话,在没有支持程序调试时,通常只能是在原始代码中输出一堆的信息到console,例如java中就是System.out.println或System.out.err,于是运行,看看console中一堆的信息,然后慢慢的来推测问题,当然,这也是一种可选的方案,甚至在某些场景中是一种不错的方案,但在各种IDE支持程序调试后,更多的时候调试都可以通过IDE来进行,发明这个的人真的太伟大了,虽然我不知道是谁,但是还是想膜拜下的,:),有些看似很小的功能,往往非常的重要,于是现在的我们可以幸福的设个断点,然后开始逐行跟踪、跳行跟踪、跟踪进入函数内部、跳出函数、跟踪变量甚至修改变量等等N多种的方式幸福的调试着代码,看着代码在运行时的状态,很容易的就让我们发现代码中的问题,这个绝对是节省了非常非常多的时间,所以我说我很佩服那些号称用记事本写代码的高手们,难道他们的代码都是零bug的?要么就是出了bug后也可以一眼判定问题所在的?那实在太强了点,对于这样的高手,确实可以不需要IDE这种现代化的武器,对于我而言,用记事本写就像停留在原始时代,而IDE差不多应该到帝王时代了,:),开玩笑,调侃下用记事本写代码的高手而言,这是单元测试中的场景和通常采用的技巧。
还有需要调试的场景通常会是集成测试场景,通常,集成测试会复杂很多,于是要用到的调试技巧会复杂一些,就像下面这样的两种场景:
1、并发程序
   并发程序向来就是最最复杂的,没有人能知道在运行时到底是怎么个执行顺序,否则就不叫并发了,:),于是,在并发程序中,N多种人脑无法想象的复杂场景就出现了,毕竟人脑的思考应该不支持并发的吧,至少我的貌似支持不了,也许是我笨,呵呵,而且通常并发程序中的错误是不一定能每次都重现的,这是最麻烦的,至于借助IDE调试,同样是不行的,因为并发程序由于断点的进入可能完全被打乱,于是,对于并发程序,通常能采用的方法,比较靠谱的方法,我觉得还是打日志,当然,你可以选择继续System.out.println、System.out.err,或者采用更加高级和优雅点的log.debug这样的方法,然后就看着时间戳来慢慢的运用自己的大脑来思考复杂的并发的问题,:),这绝对是一种挑战,但因此也会带来充分的乐趣,于是慢慢的享受这个过程吧。
   多说一句,还好现在java有了更高精度的时间戳:System.nanoTime,用System.currentTimeInMills根本就没法分析并发程序,因为它的精度不够。 
2、所依赖的程序有问题
   这种场景嘛,相对而言就复杂很多了,因为通常这个时候能做的多数是通知所依赖的程序方去查找问题,但如果手头有所依赖的程序的代码的话,多数可以采取跟入其源码的方式,尽管不一定能修复其源码,但对于查找出问题还是会提供很大的帮助,例如跟踪框架代码、jdk代码等等,对于访问的远程程序而言,则不太相同,java嘛,还好,可以支持远程调试,我相信现在的大部分语言都支持的,远程调试那是相当的重要呀,于是我们就可以在本地调试着远程某台服务器上执行时的bug,:),偷着乐吧。
最后一种最痛苦的大家最想调试的场景,就莫过于生产环境了,估计有N多人都想直接在生产环境中调试,看看生产环境中的问题是怎么产生的,但生产环境嘛,是不太可能拿来调试玩的,而有些时候线下要模拟也不是什么简单的事,说到这,又要天马行空的瞎扯下了,记得在云风的blog上以前有写过一篇游戏中对于出错场景的记录以及回放的功能,这功能听着是相当的帅呀,好,继续回到正题,在自己的代码还没有如此强大的错误记录和回放功能时,也许能做的选择就是在代码中多写一点log.debug了,在生产环境有问题时,则打开相应的日志的debug项,然后继续靠人肉分析了,这个时候还是体现了log.debug的强大作用滴,根据这点可以看出,在代码中还是有必要写些合适的log.debug的,除了为了自己外,对于其他使用的人调试bug也是可以給予很大的帮助的。

嗯,没想到稍微扯了下,也写了不少,从这稍微写的内容中,其实也能看出,调试可不是闹着玩的事,绝对需要相当完整的知识体系,这也难怪张银奎的《软件调试》写了三年,而且那么的厚,看来还是值得看看的,:),小广告,大家别在意。
而且这里还没说到,通常需要调试的时候,多数都是出问题的时候,那么这个时候还会面临很大的压力,怎么样在紧急的时间内还冷静的做好人肉分析的工作,这可是相当的考验抗压能力、技术基本功、逻辑分析能力和学习能力的过程,想想,要能在短时间内查出问题的原因,通常需要对代码运行的场景做出冷静的分析,进而需要具备从头到尾的知识,例如所采用的框架、java包、甚至到JVM、操作系统、硬件,实在不行的话,还得临时学习下这些知识,这样才能在短时间内解决,因此想来想去,越来越觉得如果在面试的时候让面试者现场调试段程序貌似还是挺靠谱的,更有助于全方位的考察,貌似只有很少数的几家公司会这么干,当然,这有客观条件的原因,但要克服貌似也不是很难。

BlueDavy 2008-11-18 23:49 发表评论
分享到:
评论

相关推荐

    代码生成器.zip

    Database2Sharp是一款代码生成工具和数据库文档生成工具,该工具从2005 年开始至今,一直伴随着我们的客户和粉丝们经历着过各种各样的项目开发, ...使用,是一种适应性非常强、弹性很好的应用框架。

    基于C++的爱心代码实现

    调试测试:测试并调试代码,修复出现的问题。 项目展示:将最终的心形图案展示给用户,收集反馈并进行改进。 项目意义 通过基于C++的爱心代码实现项目,学习者不仅能掌握C++的基本语法和图形处理技术,还能体验到...

    自己动手写操作系统(含源代码).part2

    正如于渊在本书结尾中所说“我们写自己的操作系统是出于一种好奇,或者说一种求知欲。我希望这样不停地‘过把瘾’能让这种好奇不停地延续”。 好奇心是动力的源泉,追究问题的本质是优秀黑客的必备素质,只有充分...

    自己动手写操作系统(含源代码).part1

    正如于渊在本书结尾中所说“我们写自己的操作系统是出于一种好奇,或者说一种求知欲。我希望这样不停地‘过把瘾’能让这种好奇不停地延续”。 好奇心是动力的源泉,追究问题的本质是优秀黑客的必备素质,只有充分...

    [计算机毕设]基于asp.net的网络办公助理系统设计与实现(源代码+项目报告).zip

    C#就其本身而言只是一种语言,尽管它是用于生成面向.NET环境的代码,但它本身不是.NET的一部分.一些特性由.NET支持,但C#不支持.而另一些特性C#语言支持, .NET却不支持! C#的优点: (1)完全支持类和面向对象编程,包括...

    一种基于JSP自动排课管理系统的设计与实现(含jsp源码和文章说明和数据库).rar

    (3) 编写代码 (4) 调试运行 (5) 编译应用程序 (6) 发布应用程序 界面设计 (1) 控件的位置 (2) 界面元素的一致性 (3) 保持界面的简明 (4) 使用颜色和图像:增加视觉的感染力 (5) 图像和图标:增加...

    一种基于JSP网络故障管理平台的设计与实现含jsp源码和文章说明和数据库).rar

    对网络故障管理进行详细调研,选定JSP和一种常用数据库作为开发环境,完成针对校园网故障管理所需要的主要功能,包括故障的记录,派单,统计和查询。 1. WINDOWS 环境下Tomcat的安装和配置 2. JSP开发环境的配置。...

    明小子4.3.3网站漏洞检测工具

    Domain4.3(明小子)10.10.10更新版主要更新内容如下: 1.驱除部分死连接,恢复部分官方连接 ...分享也是一种快乐,工具仅做辅助作用请勿用在非法用途上! 程序自带本BLOG连接,启动比较慢!不喜勿用!谢谢合作!

    Domain4.3(明小子)

    Domain4.3(明小子)10.10.10更新版主要更新内容如下: ...分享也是一种快乐,工具仅做辅助作用请勿用在非法用途上! 程序自带本BLOG连接,启动比较慢!不喜勿用!谢谢合作! 程序所有权归: <明小子> 程序修改:宝宝

    Visual C# 2005程序设计自学手册 源码--iso文件!!(切记)

    光盘提供了书中所有实例的源代码,全部源代码都经过精心调试,在Windows XP/Windows 2000/Windows 2003 Server下全部通过,保证能够正常运行。  本书适用于C#初、中级用户,也可作为大、中专院校师生和培训班的...

    c#学习笔记.txt

    有很多人用程序来表述爱情,在其中我能看到有Money,有Girl,有一些还涉及到Sex,但是我没有找到Love,我始终相信这世上有一种力量直接来自于爱情,到现在仍然相信。*/ C#(读作C sharp),是Microsoft公司新推出的...

    Domain4.3(明小子)检测漏洞

    Domain4.3(明小子)10.10.10更新版主要更新内容如下: 1.驱除部分死连接,恢复部分官方连接 ...分享也是一种快乐,工具仅做辅助作用请勿用在非法用途上! 程序自带本BLOG连接,启动比较慢!不喜勿用!谢谢合作!

    明小子工具4.3

    Domain4.3(明小子)10.10.10更新版主要更新内容如下: ...分享也是一种快乐,工具仅做辅助作用请勿用在非法用途上! 程序自带本BLOG连接,启动比较慢!不喜勿用!谢谢合作! 程序所有权归: <明小子> 程序修改:宝宝

    明小子(网络探测)

    Domain4.3(明小子)10.10.10更新版主要更新内容如下: ...分享也是一种快乐,工具仅做辅助作用请勿用在非法用途上! 程序自带本BLOG连接,启动比较慢!不喜勿用!谢谢合作! 程序所有权归: <明小子> 程序修改:宝宝

    errorx:全面的Go错误处理库

    解决该问题几乎没有乐趣: 错误:EOF 错误:值的开头出现意外的'>' 错误:参数值错误errorx库提供了一种创建工具集的方法,该工具集可以通过考虑以下因素来帮助解决此问题: 拥有所有必需的调试信息的错误,无需格外...

    算法设计、分析与实现从入门到精通(徐子珊):C、C++和Java.pdf

    《算法设计、分析与实现:c、c++和java》特色是按照算法之间逻辑关系编排学习顺序,并对每一个经典算法,都给出了完整的c/c++/java三种主流编程语言的实现程序,是一本既能让读者清晰、轻松地理解算法思想,又能让...

    快乐交易游戏装备交易系统v2.2

    经过长期的测试和调试。注册/登陆/发布信息/回复信息等 采用图片验证码,防止洪水攻击更安全的代码传送密码使用MD5加密等等?高速:经过许多次页面优化和程序优化,尽量提高运行速度。比如:采用JS处理前台显示,大大...

    Tcl_TK编程权威指南pdf

    内容简介回到顶部↑Tcl/Tk是第一种能通过Windows、Macintosh和Solaris等主要平台处理企业级任务的脚本语言。本书共分为55章,依次详细讲述了Tcl基础、Tcl高级特性、TK基础、TK组件、TK详解、C语言编程、各版本之间的...

    comp-250-assignment-2-tester:针对COMP 250的第二项任务的协作测试套件

    COMP 250作业2测试仪 针对COMP 250的第二项任务的协作测试套件 ... 不建议这样做,因为您可能会错过一些东西,但是它比最后一种方法快。 您也可以添加新测试并创建拉取请求。 快乐的编码和调试! 正在安装 对于Int

Global site tag (gtag.js) - Google Analytics