怎样成为调试高手与编程高手

业界总是有高手之说,高手成了程序员心中之偶像,成了程序员成长之目标。但是,现实中人们往往对自己所了解的程序员,很难认同为高手;人们反而对那些自己不了解的,甚至是道听途说的人会认作为高手了。高手,同武林高手一样,神秘之至。

  许多程序员都有这样的经历:无论自己编写什么很短很短的程序,一般是很难一次就能通过编译的;通过编译的其功能还不一定是正确的。我在很早就注意这样现象了,开始的时候,我还不信这个邪,还试着编写程序看看自己能否一次能否编译成功,为这个事还和别人打过赌呢!这当然是年轻时做过的事了。后来我渐渐明白了,编程出错是编程的一个重要的部分!出错是正常的,不出错才是不正常的。出错怎么办?当然是改错啦!不知道错在什么地方怎么办?当然是调试啦!调试于是和编程相依相伴了。程序员不但要会编写程序,还要会调试程序。

  程序出错一般有:未定义、语法、运行出错三个方面。

  未定义

  未定义往往是程序员的忽略定义或定义后名称与定义不一致造成的。

  • 要避免忽略定义这个问题,程序员首先要养成严谨工作的习惯:“先定义,后使用”。
  • 解决定义名字与使用名字不一致问题,程序员在对函数名、变量名、文件名、数据库名、表名、字段名定义的时候,不要信手拈来,象不花钱似的任意取名。一定要定下心来慢慢地斟酌,这个名字自己不但要能懂能记得,别人一看也要能懂能记得。程序员可以假设自己定义一个变量就要花出去100元钱,如果别人看不懂就要另外支付200元。有了这种名字的“有偿使用”,这样程序员就不可能乱取名了。长此以往,在使用这些名字的时候程序员就会有行云流水感觉,而且很少出错。

  语法问题

  • 新手编程走一步一个跟头,走两步两个跟头,主要是对语言的语法不熟悉,丢三拉四,关键字拚错等。这种情况不可怕,多看看语法说明,多改改程序就会对语法越来越熟悉了。
  • 老程序员语法问题出现较少。但是,很多情况下程序员在使用新语言编程序的时候,会采用老语言的语法,反之亦然,导致出错。例如,某人先使用C语言,后使用VFP。当用VFP编程的时候,往往习惯性地在语句后面加上“;”,这导致VFP语法出错。当熟悉VFP后,再编写C语言的时候,往往在语句后面忘记加上“;”,导致C语言语法出错。类似常见问题如:IF语句后面表达式是否要加“()”等,for 语句,while 语句,case语句在不同的语言的语法都有可能不同。另外,不同数据库中的SELECT 、INSERT、语法都有一些不同处,这些不同之处,往往让程序员不知所措,老是要停下来思考一下,现在用的是什么语言用的是什么语法。

  运行问题

  定义、语法这些都是显式出错,相对好解决。但是运行中出现错误就五花八门了,我试着归纳一下:

  • 运行中程序突然中断了并退出了。往往是内存出错!可查变量、指针是否越界,指针是否为空等、例外没有处理。
  • 环境问题。例如,数据库密码错导致数据库打开不了、要打开的文件不存在、参数定义错,参数表为空,参数表没有缺省值等。
  • 程序的输出的不是自己的预期结果。往往是程序逻辑和算法存在问题。
  • 程序不停地运行没有停止的迹象。查一下循环的条件表达式是否永真、导致死循环。
  • 程序无法退出。程序乱了,导致内存错,覆盖了退出指令!
  • 程序运行了很长时间才出现了错误。累计误差、数据原因造成的错误等。

  出错是必然的,如何找出错误,有些人编写C语言的人只会用在可能出错的语言前后,通过显示语句print来判别出错的原因。他们不懂debug、 sdb、 dbx等调试工具,来调试程序,他们会编不会调。我们很难想象不会调试的程序员是如何编程的,调试对于程序员如此重要,以致于可导致出“不会调试的程序员就不是程序员”的结论。

  现在的开发语言具有功能丰富的调试命令。无论用什么设计语言调试,你只要注意掌握以下几个命令或操作,就能入门调试了:

  1. 运行程序
  2. 设置断点、取消断点
  3. 运行到断点
  4. 单步跟踪(setp into)
  5. 单步执行(step over)
  6. 显示变量、对象、源程序
  7. 退出调试

  你可以按此去寻找相应的命令和操作,并熟记于心中!此法必有大用。

  通过调试,程序员可以学会如何运用断点、如何最快地找到可疑语句,如何很迅速地找到问题所在从而改进程序。而不断地调试,使得程序员不停进行调试操作,变成了操作高手。调试内容可以说千变万化,技巧也多多,关键看程序员的积累。例如,循环语句调试的技巧、同步异步调试的技巧、中断调试技巧、外设调试技巧、数据库调试技巧、边界调试技巧、例外调试技巧、屏蔽法调试技巧、替代法调试技巧、接口调试技巧等等。

  调试象开车一样,不会开的时候,程序员有恐惧感,会开了以后,程序员特别想调,开多了,程序员越发老练,调试操作越来越快、对问题发生的原因和纠正方法也熟记于心中,技巧也油然而生,积累越来越多。

  好的程序员不但调试自己的程序,而且会帮助其他程序员解决调不出来的程序的问题。程序员在帮助别人的时候,更能尽显调试才华,成为真正的调试高手。

  调试总的目标是为了纠正程序的错误。但是,调试也可用于其他的用途。例如,我经常会先把函数的调用语句给写好,但是不写函数体,这样每次编译都会出现函数没有发现的提示。我不写函数体的目的,就是让每次编译的时候提示我还有多少函数没有编写。让我对这个函数加深印象,给我有时间思考这个函数如何编写。当其他语句编写完后,我再一个一个把没有编写的函数内容补上,这个时候编写就快的多了。有的时候,我还喜欢看到几十条上百条的出错提示,然后,我感觉于一个改错就能消灭几十个错误的快感之中,然后再改再调,直到无错。调试成了我娱乐编程的一部分。

  通过调试你也会发现:编程水平直接影响到调试。如果程序很具有模块性,调试起来就很快,几个或十几个单步执行就会到达程序的任何地方,如果程序本身逻辑性不强,变量命名不准确、一个函数内语句有数十条数百条,那你几百个单步执行都到达不了你想要达到的地方,程序调试起来就会很麻烦,而且不容易定位出错的地方。所以调试高手往往会改进自己的编程,使得编程水平日益提高,成为编程高手。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
梁肇新开发技术总结,值得借鉴 这是我在网上能够找到的最清晰的版本,分享给大家 目录: 第1章 程序点滴 1 1.1 程序≠软件 1 1.1.1 商业软件门槛的形成 2 1.1.2 认清自己的发展 4 1.2 高手是怎样练成的 5 1.2.1 高手成长的六个阶段 5 1.2.2 初级程序员和高级程序员的区别 7 1.2.3 程序员是吃青春饭的吗 9 1.3 正确的入门方法 11 1.3.1 规范的格式是入门的基础 13 1.3.2 调试的重要性 17 1.4 开放性思维 18 1.4.1 动态库的重要性 19 1.4.2 程序设计流程 20 1.4.3 保证程序可预测性 21 第2章 认识CPU 23 2.1 8位微处理器回顾 23 2.2 16位微处理器 24 2.2.1 组成结构 24 2.2.2 8086寄存器组成 25 2.2.3 内存的寻址 26 2.2.4 中断处理 27 2.3 32位微处理器 29 2.3.1 寄存器组成 29 2.3.2 保护模式 32 2.3.3 80386的寻址方式 32 2.4 【实例】:在DOS实模式下读取4GB内存代码分析 36 2.4.1 程序的意义 37 2.4.2 程序代码 37 2.4.3 程序原理 41 2.4.4 程序中的一些解释 42 第3章 Windows运行机理 44 3.1 内核分析 44 3.1.1 运行机理 44 3.1.2 LE文件的格式 53 3.1.3 VxD的设计实现 59 3.1.4 【实例】:CPU降温程序代码分析 65 3.2 消息的运行方式 82 3.2.1 认识消息 82 3.2.2 Windows系统中消息的运作方式 84 3.2.3 消息处理过程实例 87 3.3 GDI的结构和组成 89 3.3.1 GDI的组成 89 3.3.2 GDI和DirectDraw的关系 91 3.4 线程的机制 93 3.4.1 线程的工作方式 93 3.4.2 线程与GDI的冲突:死机的主要原因 94 3.4.3 线程的内存泄漏的主要原因 96 3.4.4 进程管理 98 3.4.5 同步机制 100 3.5 PE结构分析 103 3.5.1 PE头标 103 3.5.2 表节 113 3.5.3 PE文件引入 119 3.5.4 PE文件引出 125 3.5.5 PE文件资源 129 第4章 编程语言的运行机理 133 4.1 汇编的原理 133 4.1.1 指令系统 133 4.1.2 汇编与Win API的接口方法 141 4.1.3 【实例】:自定义程序的入口点 145 4.2 高级语言的原理 151 4.2.1 C/C++的原理 151 4.2.2 解释语言的原理 165 4.2.3 【实例】:用C实现简单的BASIC语言环境 165 4.3 C、C++的学习方式 187 4.3.1 从BASIC到C 187 4.3.2 C、汇编、API的关系 187 4.3.3 接口的建立方法 190 4.4 挂钩技术 201 4.4.1 Windows上C的挂钩 201 4.4.2 C++的挂钩技术 213 第5章 代码的规范和风格 220 5.1 环境的设置 220 5.1.1 集成环境的设置 220 5.1.2 TAB值的设置 221 5.1.3 编译环境的设置 222 5.1.4 设置herosoft.dsm宏 224 5.2 变量定义的规范 227 5.2.1 变量的命名规则 227 5.2.2 变量定义的地方规定 228 5.2.3 变量的对齐规定 229 5.3 代码对齐方式、分块、换行的规范 230 5.4 快速的代码整理方法 232 5.5 注释的规范 233 5.6 头文件的规范 236 5.7 建议采用的一些规则 236 5.8 可灵活运用的一些规则 238 5.9 标准化代码示例 239 5.10 成对编码规则 243 5.10.1 成对编码的实现方法 243 5.10.2 成对编码中的几点问题 248 5.11 正确的成对编码的工程编程方法 251 5.11.1 编码前的工作 252 5.11.2 成对编码的工程方法 255 5.11.3 两个问题的解释 260 第6章 分析方法 266 6.1 分析概要 266 6.1.1 分析案例一:软件硬盘阵列 268 6.1.2 分析案例之二:游戏内存修改工具 274 6.2 接口的提炼 286 6.2.1 分离接口 286 6.2.2 参数分析 287 6.3 主干和分支 290 6.3.1 主干和分支分析举例 291 6.3.2 程序检?? 300 6.4 是否对象化 301 6.5 是否DLL化 307 6.5.1 DLL的建立和调用 307 6.5.2 DLL动态与静态加载的比较

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值