`
loseone
  • 浏览: 34661 次
  • 性别: 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 发表评论
分享到:
评论

相关推荐

    zhunipingan.rar_生日快乐代码_生日程序代码_祝你 生日快乐 程序 代码

    首先,8951单片机作为该程序的载体,它是一种广泛应用于电子产品的微控制器,具备控制小型电子设备或玩具的能力。单片机编程是一种低级的编程实践,它要求程序员对硬件拥有深刻的理解和直接控制的能力。在这样的背景...

    codeblocks 单步调试演示

    1. **什么是单步调试**:单步调试是一种逐行执行程序的方法,它允许程序员观察每一步的执行情况,包括变量的变化、函数调用等,以便找出潜在的问题。这对于理解代码逻辑、定位bug至关重要。 2. **CodeBlocks的调试...

    圣诞树&代码情书&生日快乐源代码

    2. **代码情书**:这是一种创意的编程实践,程序员用代码编写一封情书,可能包括用特定语言(如JavaScript、Python或Ruby)编写的一段表达情感的文本,或者创建一个动态的、互动的网页。代码情书可以利用编程语言的...

    自制串口调试助手

    串口通信,即串行通信,是计算机硬件之间进行数据传输的一种方式。它通过一条数据线逐位发送和接收数据,常见的串口标准有RS-232、RS-485和USB-to-Serial等。串口通信的优点在于其简单、成本低,适合短距离、低速率...

    代码之美(深入解剖代码)

    1. **编程思想**:作者阐述了编程不仅仅是解决计算问题,更是一种表达思想的方式。理解和欣赏代码之美,需要我们具备抽象思维、逻辑推理和问题解决的能力。 2. **代码结构**:良好的代码结构是代码之美的重要体现。...

    OD+CE+代码注入

    【代码注入】是一种高级技术,它允许用户将自定义代码插入到另一个正在运行的进程中,以改变其行为。在合法的应用中,这可能用于系统监控、调试或性能优化;而在非法或作弊场景中,如游戏,代码注入可能被用来获取...

    c语言调试工具

    GDB是一款强大的源代码级调试器,适用于多种编程语言,包括C。它允许程序员设置断点、单步执行、查看变量值、跟踪调用堆栈等,是开发者进行调试的得力助手。而Insight是GDB的一个图形用户界面,它将GDB的命令行操作...

    小猪佩奇学习代码

    9. **调试和优化**:通过实践,学会如何调试代码,找出问题,并优化代码以提高效率。 通过这个项目,你可以不仅学习到Python的基础语法,还能锻炼逻辑思维能力和问题解决技巧。而且,用编程绘制出自己熟悉的角色,...

    2023新年快乐代码.zip

    压缩包中的“新年快乐代码”很可能是一个完整的程序或代码片段,它综合运用了以上提到的技巧,为庆祝新年提供了一种数字艺术的表现形式。如果这个代码是开源的,那么对于学习编程的人来说,它将是一个很好的学习资源...

    ICCAVR与Proteus联机调试图解教程.doc

    ICCAVR与Proteus联机调试是一种高效且直观的微控制器编程调试方法,尤其适合初学者和那些希望节省成本的开发者。ICCAVR是一款由IAR Systems开发的集成开发环境(IDE),专用于AVR系列微控制器的C语言编程。然而,ICC...

    申请软著代码整理工具,快速清除代码中注释

    【软著代码】软著全称为“计算机软件著作权”,是中国版权保护中心对计算机软件进行的一种法律保护形式。它赋予软件开发者对其作品的独占权利,包括复制权、发行权、修改权等。在申请软著时,需要提供无注释的源代码...

    全网最细谷歌小恐龙无敌代码它来了!

    除了无敌代码,还有一种方法可以让小恐龙的速度倍增,这就是“加速代码”。同样的,在控制台中输入以下代码: ```javascript Runner.instance_.setSpeed(50) ``` 括号中的数值可以修改为任意正整数,数值越大,小...

    飞机游戏源代码

    1. **C++编程**:C++是一种广泛用于游戏开发的高级编程语言,因为它提供了一种高效、灵活的方式来创建复杂的系统。游戏中的飞机运动、碰撞检测、子弹发射等都是通过C++的面向对象特性来实现的。 2. **撞机检测**:...

    什么是爱心代码c语言以及学习爱心代码c语言的意义

    无论你是想要入门学习C语言的新手,还是希望寻找一种特别方式来表达感情的人,爱心代码都能为你提供一个简单而又充满乐趣的选择。在未来的学习旅程中,它将作为一个美好的开始,引领你走向更加广阔的编程世界。

    51单片机音乐程序_祝你生日快乐

    Keil C51是专为51系列单片机设计的高级集成开发环境,支持C语言编程,使得编写和调试代码更为便捷。对于“祝你生日快乐”音乐程序,开发者需要编写C语言代码,定义每个音符对应的频率值,并通过定时器中断来控制音乐...

    界面设计源代码

    【界面设计源代码】主要涉及的是Java Swing库的使用,这是一种用于创建图形用户界面(GUI)的Java API。Swing提供了丰富的组件集,允许开发者构建功能完备、交互性强的应用程序。在Java的IDE环境中,如Eclipse、...

    代码生成器.zip

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

    PHP调试工具(PHP debug tools).7z

    在IT行业中,PHP是一种广泛应用的服务器端脚本语言,尤其在Web开发领域占据了重要的地位。为了提高PHP开发效率和代码质量,开发者们通常会使用各种调试工具。"PHP调试工具(PHP debug tools).7z"这个压缩包文件很可能...

    C语言编程源代码

    C语言编程源代码是学习C语言的宝贵资源,尤其对于初学者来说,它提供了一种实践和理解编程概念的方式。C语言是一种强大的、低级的编程语言,被广泛用于系统编程、嵌入式开发以及软件工程的各个领域。通过源代码的...

    TCP/IP实验基于TCP和UDP的应用编程(内含源代码、调试文件和实验报告)

    实验中包含的源代码和调试文件将帮助你实际操作这些概念,理解它们在真实环境中的应用。实验报告则提供了理论知识和实践结果的结合,总结了实验过程和学习心得,有助于巩固理论知识并提高解决问题的能力。 通过这次...

Global site tag (gtag.js) - Google Analytics