正文

[z]程序员调试能力和相关书籍2011-01-15 15:08:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lym51/52177.html

分享到:

在软件行业中,个人觉得每个Coder、Leader(那些当了Leader以后就不需要Code的除外)都应该除了具有良好的编码能力以外,最为 主要的就是Debug的能力要坚实。千万不要告诉我Debug工作是Tester和QA的事情,首先你要认识到Debug的能力是一个并不简单的能力,能 帮助你提高你的开发能力,加快开发速度,节约开发成本;其次你更应该知道,你所掌握的Debug的能力和技术并不可能抢去Tester或者QA的饭碗,他 们做的工作更仔细、全面,更富有创造力。由于本人数年来一直使用VC6,所以下面使用的观点和相关的描述都是从VC出发的,肯定有所偏颇、错误之处,还望 各位看官不吝啬地指出,本人定虚心接受,共同讨论,共同学习,共同进步。个人觉得Debug能力包括以下三个个方面:  
   
  1、良好的编码习惯,良好的逻辑结构能力,对Bug的预见能力。一个成熟的程序员,应该有一个良好的编程习惯,不仅需要有良好的编码格式规范,更为需要的 是对于程序中的逻辑实现时候有一种良好的结构。编程其实就是数据和逻辑的集合,数据的处理较为简单,或者说是需要的逻辑思维能力比较少,当算法逻辑要在数 据上实现的时候,同一种逻辑,让不同的程序员来实现可能有各种各样的不同实现结构,从这个角度来说,这里所说的“良好的编码习惯”就应该指的是对于逻辑实 现时候使用的良好的编程结构,一个好的编程结构应该是能预防错误的发生,对错误的预见和错误出现以后的错误处理与异常处理的良好安排。也许有人说这不好办 吗?每个逻辑判断的地方添加条件判断或者异常处理不就行了?个人觉得不是那么回事,过多的if、assert、ASSERT等语句或者是宏,尤其是并列的 if语句需要耗费很多判断、执行的时间,对于一个子程序(函数),尤其是调用频率比较频繁的子程序(函数),一次浪费了一点点时间,多次、频繁地调用浪费 的时候就显得可观了,所以并不是if语句使用的多,程序出错的可能性就小,过犹不及!如果确实需要使用多个if语句进行条件判断,最好能使用嵌套的if语 句,逐步的缩小判断范围,这样消耗的时间要比并列的if语句要小,还要注意的是if语句的条件判断也不是万能的;assert、ASSERT等判断宏也不 是万能的,它会造成Debug和Release版本在响应速度和最终的编译结果的不同,对于一些关注于性能、响应速度的程序,所造成的影响是不可忽视的。 不过开发过程中的调试阶段倒是提倡使用这些宏来发现算法错误和不足。另外对于异常处理段的使用,个人觉得能不用异常处理的地方尽量不要使用异常处理,除非 当某个错误发生以后导致程序不能继续执行或者是崩溃的时候才使用异常,有时候你能使用异常处理,将发生错误的程序继续执行下去,但是可能产生的最后结果并 不是客户所需要或者是期望的,这样就容易让客户产生质疑:你是不是在程序中做了什么手脚?这也让你失去了获得Bug发生的前提状况信息,从而失去了一次修 改Bug的机会,所以说有时候当程序发生错误时,仅仅弹出一个MessageBox提示一些信息,然后关闭程序,也不失为一个好的办法。  
   
  2、编码过程中的调试跟踪和错误定位能力。这个能力主要就是在开发过程中,当自己在Build程序,Run起来以后,竟然发生了Bug或者是Memory   Leak,这时候就需要你使用各种工具进行调试跟踪了。首先你要相信VC不仅是一个很好的IDE,也是一个很好的Debug工具,其提供的调用栈、条件断 点、数据断点、反汇编等工具足够强大,足够应付平常的Bug,但是现在很多的程序员,包括一些自称为老程序员的也未必能很好的使用这些工具,尤其是条件断 点和数据断点(在下面介绍的第二本书中有详细的使用说明)。当VC不能满足你的要求的时候你就需要使用其他的工具了,例 如:SmartChecker,BoundChecker,Purify,SoftICE等等了。从这个角度来说,这里的“调试跟踪能力”不仅是程序员对 Bug的定位能力,更为主要的还是对于调试工具的掌握、使用的能力。“磨刀不误砍柴工”,在开发之前或者开发闲暇时,好好的研究一下一些开发、调试工具不 愧为一种好的提升这种能力的好办法。能静下心来思考一下这些工具的工作原理就更好了,这样不仅能帮助你在编程的时候预见Bug,并且对你提高你的编程技巧 也会有所帮助。例如VC中的程序在Debug模式下为什么能发现数组访问越界?这是因为在Debug模式下,在分配数组所占用的内存时候,编译器在数组内 存的两端分别加入了一个字节的越界判断内存。这也就是为什么很多的MFC程序在使用自定义消息的时候在Debug模式下没有错误而在Release模式下 发生错误的原因了。这里我还想说一说我最喜欢做的两种调试方法:当Bug出现的时候,首先确定Bug的位置,然后:A、注释掉可能导致Bug的段落,在需 要取得数据值的地方直接提供一个合理的值,然后看看程序是否能正确运行,如此循环往复,逐步缩小范围,最终找出Bug所在;B、如果Bug被定位在一个小 的功能、子程序或者函数中,可以使用新建一个Test工程,在一个完全“干净”的环境下,对此功能、子程序或者函数进行测试,找出Bug所在。此节最后我 想说的就是利用你的网络。当一个Bug出现时,你也许感到茫然,也许感到无从下手,这时候你就可以利用的你网络资源,使用强大的搜索引擎(比如 Google、Baidu等等),输入相关的错误提示信息,也许搜索到类似问题的网页,也许别人也遇到过同样或者同类的问题,其他人所提供的答案就是你所 需要的,或者能给你以提示、启发的!  
   
  3、对事后发生的Bug能有良好的感知能力。当一个Bug出现的时候,优秀的程序员能根据Bug发生的前提和Bug发生的时间点、程序中的位置,很好的感 知到Bug可能发生在哪一个函数或者哪几个函数中,是什么情况导致Bug的出现的,并且能够很快的定位错误并Fix这个错误。这种能力使用的地方往往是程 序已经Release了,已经被客户使用了,在使用的过程中发生了Bug,客户向你“倾诉”时。那么怎么才能有这样的能力呢?也许很多的这种能力都是在你 不断的摔倒,被经理P了N次以后,所积累起来的经验,所以说这也是一种痛苦以后所获得的快乐的能力,它需要你对自己所做的软件产品的结构、运行条件、运行 原理和相关的涉及部分有很好的理解、掌握。有的时候多在网站上看看别人的经历也能有所收获。  
   
          在以上的三种能力中,第一种能力主要在于态度和思维能力,后两种则偏向于学习能力和经验的积累;个人觉得第一种最为重要,所谓的“态度决定一切”嘛,呵呵。  
   
          最后向你推荐几本关于调试的书籍:  
   
  1、《Writing   Clean   Code——Microsoft   Techniques   for   Developing   Bug-free   C   Programs》(中文版译作《编程精粹——Microsoft编写优质无错C程序秘诀》或者叫做《零错误程序》)——这是一本出版很早的书,现在也许 在书店中都看不到了,但是你要相信此书的作者Steve   Maguire(曾是Microsoft资深的程序员,参加了Excel在多个平台下的开发和移植工作)所提供的许多防错、排错、测试的准则还是能让人从 中获益非浅的。作者将每章的要点都和自己实际工作经历相结合,提供了翔实的例子和相关代码,使用的语言更是幽默风趣,让人读起来不会感觉晦涩难懂,尤其是 每章结束部分提供的练习和思考题更是贴合实际,发人深省。也就是这些原因才使得这本书经久不衰,一直为广大程序所喜爱,所广泛地讨论。至今尚未能见到能与 之相媲美的书籍。网上所流传的林锐博士所著的《高质量C++编程指南》和《软件工程思想》在深度和广度上与之相比也显得逊色不少!  
   
  2、《Debugging   Windows   Programs》(中文版译作《Windows程序调试》,中国电力出版社出版)——这是一本现在在书店很为流行的一本书。此书使用的语言比较朴实、易 懂,也许是译者精心处理的结果,叙述习惯比较符合国人口味。这本书主要包含调试策略、调试工具、调试技术三部分,本书主要介绍的是在VC这个IDE、编译 器下开发程序所应有的一些技术。看完此书你肯定会更为深入的了解MFC,了解结构化异常和C++异常的区别和联系,了解怎么调试多线程程序,怎么调试 COM程序,怎么调试内存,怎么调试绘图程序等等。不管你是自认为有多年的开发经验的开发高手,还是刚刚入门的初学者,相信只要你耐心的看完此书,你一定 会和我一样深深的感叹一句:原来VC的调试功能这么强大!如果早点看到这本书就好了!  
   
  3、《Debugging   Applications》(本人尚未见到中文版)——这本书主要介绍的是VC和VB的调试,其中VC的调试占到70%-80%左右。本书也分为三部 分:Debug的形式,强有力的Debug,Debug的工具和技术。其中有部分内容和上一本书所说的相同。但是这本书还是提供了很多新的东西:介绍了远 程调试,提供了一些新的工具使用例子的说明,介绍了更多的底层的东西,甚至涉及汇编的相关信息的阅读和理解。在阅读了上一本书以后,如果你还想提高,这本 书是你不错的选择。  
   
          第一本书主要就是培养大家第一种Debug能力的,后两本书是培养大家第二种Debug能力的,对于第三种能力主要还是要靠经验的积累。  
   
          我现在就看到这三本书是比较好的书,如果你觉得有其他的比较好的相关书籍或者相关信息请告知我。在肯定这几本书对你的开发过程会有所帮助的前提下,另外我 想说的就是即使你看了这几本书你也不会编写出完全没有Bug的程序,毕竟Bug的种类和发生的情况实在是有很多的客观和主观因素,不可能完全杜绝。程序设 计是一门实践性很强的工作,唯有在工作、实践过程中总结教训,总结经验才能不断提高。祝大家在获得知识,积累经验的过程中少走弯路,大踏步的前进!!!  
   
  (本文版权归作者所有,如需转载请注明作者和出处,否则也可以转载,但千万不要标注为你个人的作品,否则产生的一切后果请自负,尤其是被BS、被扔臭鸡蛋的时候,千万不要怨恨我,同时作者我还保留BS你的权利,^_^)  
  问题点数:200、回复次数:68Top

1 楼vcleaner(我没当大哥很久了.......)回复于 2005-05-23 09:09:56 得分 0

至于为什么会在本文的结束部分使用那段版权申明,主要是因为前段时间我发现我以前写的一些文章被转载在个别的网站上而没有注明出处和作者,甚至个别 人在自己的Blog上直接将我的文章Copy、Paste为自己的作品。本人甚是BS类似的人和相关的网站,因为他们可能连最为简单的测试和验证都没有进 行就相信了我所说的一切,甚至连最明显的遗漏的单词和语句都没有添加上,导致我比较拙劣的文笔暴露在大庭广众之下,使我身心受到很大的伤害,呵呵,所以此 次添加了这个版权申明。添加这个版权申明并不表示我反对转载、Copy/Paste我的文章,我甚至还期望你们这样做,但是请在做这件事情之前,仔细阅 读、思考我的文章中所说的东西,修改、验证其中你认为错误或者不足的地方,以免因为我的知识的不足而写出的文章,加上你们的强大的传播能力,导致更多的 人,尤其是初学者误入歧途,多走弯路,那就违背了我写这些文章的初衷了。Top

2 楼vcleaner(我没当大哥很久了.......)回复于 2005-05-23 09:10:48 得分 0

欢迎大家指教,提出不同观点,相互讨乱,相互学习,共同提高!Top

3 楼huaboy2004(华少)回复于 2005-05-23 09:12:51 得分 3

收藏Top

4 楼vcleaner(我没当大哥很久了.......)回复于 2005-05-23 09:14:40 得分 0

关于文中所提及的第一本书和第三本书都有电子版,如果哪位兄弟能提供FTP,本人将其上传,造福更多兄弟就更好了!Top

5 楼pomelowu(羽战士)回复于 2005-05-23 09:26:11 得分 3

马人口Top

6 楼vcleaner(我没当大哥很久了.......)回复于 2005-05-23 09:28:23 得分 0

马人口????Top

7 楼pomelowu(羽战士)回复于 2005-05-23 09:28:39 得分 3

寒~~~我原意是写mark……Top

8 楼djfu(一马平川)回复于 2005-05-23 09:41:55 得分 10

我记得有一本叫做《程序调试思想与实践》的外国人写的书,也不错。不过买了以后,看了才1半。Top

9 楼djfu(一马平川)回复于 2005-05-23 09:42:36 得分 3

到现在看了才一半,发现那本书还不错。,Top

10 楼koko1998(高价购买火车票)回复于 2005-05-23 09:43:07 得分 3

mark  
   
  Top

11 楼xxrl()回复于 2005-05-23 09:49:37 得分 3

马人口Top

12 楼russule(雨田)回复于 2005-05-23 10:01:55 得分 3

markTop

13 楼VCSQLVB(深谷清音(谁知还是难脱俗尘))回复于 2005-05-23 12:14:42 得分 3

MARKTop

14 楼shinubi_love(史酷比)回复于 2005-05-23 12:18:10 得分 3

收藏Top

15 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-05-23 12:20:06 得分 3

不错啊,spTop

16 楼laogong165(歪锅配翘盖,好锅头有好锅盖!)回复于 2005-05-23 12:20:32 得分 3

马人口Top

17 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-05-23 12:24:55 得分 3

几天没见楼主上CSDN了啊,一回来就给大家带好东西啊  
  赞一个Top

18 楼bohut(●伯虎● )回复于 2005-05-23 12:24:58 得分 3

upTop

19 楼yuanxiaojin(金子)回复于 2005-05-23 13:37:06 得分 3

搂主高人啊,谢谢!Top

20 楼erben(喝口蒙牛超级女生的酸酸乳)回复于 2005-05-23 14:39:46 得分 3

markTop

21 楼vcleaner(我没当大哥很久了.......)回复于 2005-05-23 16:16:27 得分 0

是有很多天没有上CSDN了,到了新公司以后比较忙!  
  就是偶尔来一次也是忙里偷闲,偷偷的上!呵呵。Top

22 楼xjbx()回复于 2005-05-24 09:35:42 得分 3

写的不错!  
   
  你可以把第3本书的电子版发给我么?谢谢!jbnet@tom.comTop

23 楼xjbx()回复于 2005-05-24 09:36:57 得分 3

不好意思mail写错了。应该是:xjbnet@tom.comTop

24 楼qrlvls( 空 气 )回复于 2005-05-24 09:40:31 得分 3

来来来,支持一把Top

25 楼krh2001(边城浪子)回复于 2005-05-24 09:57:05 得分 3

支持...      
   
  很多时候花在调试上的时间比编码要多得多,还要痛苦,   调试确实是很有学问的.Top

26 楼AntonlioX(做人要厚道)回复于 2005-05-24 10:00:46 得分 3

写的不错!  
  Top

27 楼raymond323(raymond)回复于 2005-05-24 10:21:35 得分 5

c++程序调试Top

28 楼ayanamiwww(咩~咩『抵制日货』)回复于 2005-05-24 12:00:31 得分 3

大哥,是你的帖,能不顶吗?  
   
  马人口,哈哈~~Top

29 楼laiyiling(Graphics ◎ Multimedia)回复于 2005-05-24 12:19:03 得分 3

好东西,支持一下!Top

30 楼ayanamiwww(咩~咩『抵制日货』)回复于 2005-05-24 12:45:26 得分 20

详细看了两遍大哥你的文章,挺有同感,但是小弟水平肯定没法和大哥比.....  
   
   
  不敢发表什么高论,只是想说一下自己常用的方法。  
   
  针对有很多时候,错误都针对不同的客户才出现(同一套系统),所以我除了上述方法外,更趋向于采用写文件进行Debug的方式,把可能出现问题的地方通过 日志来定位(由于有些问题不是马上能出现,出现的时间也很Random),还有就是在程序中定义一个Log的Dlg,用于实时的调试日志。  
   
  方法有点笨,但是对于处理实际的情况还不错。  
   
  就说那么多,聆听大家的高见。Top

31 楼bulepaper(雷鸟)回复于 2005-05-24 12:49:14 得分 3

顶        
  我一直觉得自己写的代码,就应该自己排错!!Top

32 楼ayanamiwww(咩~咩『抵制日货』)回复于 2005-05-24 14:45:29 得分 3

好帖没人顶呢,我顶~  
   
  收藏Top

33 楼greenteanet(扎扎实实打基础,保持一颗平常心。)回复于 2005-05-24 15:01:06 得分 3

支持..Top

34 楼horisly(SUN YAT-SEN UNIVERSITY (逸仙先生))回复于 2005-05-24 15:12:08 得分 3

支持.Top

35 楼wuchi(风云)回复于 2005-05-24 16:03:03 得分 3

Top

36 楼nextel(一切都只是感觉!)回复于 2005-05-24 17:19:23 得分 3

COPYTop

37 楼bobob(静思)回复于 2005-05-24 17:31:02 得分 3

收藏Top

38 楼angelcool(快乐需要创造)回复于 2005-05-24 17:33:15 得分 3

mark   先Top

39 楼vcleaner(我没当大哥很久了.......)回复于 2005-05-25 08:51:28 得分 0

to   ayanamiwww:  
  这里没有什么所谓的水平高低,每个人都有自己的长处、优点,每个人都有自己擅长的某一方面,只是有的人愿意总结,拿出来和别人分享、讨论。我觉得知识唯有 不断的论证才能进步。软件这个行业的理论、思想发展的很快,有些以前正确的理论,在现金未必是正确的,一些对你是正确的理论,由于其约束性,对于别人未必 是正确的。所以需要分享、论证!Top

40 楼chuanke((C ) 2005【空间代数】. All rights reserved .)回复于 2005-05-25 11:15:00 得分 3

建议共享一下资源哈[电子书]Top

41 楼chuanke((C ) 2005【空间代数】. All rights reserved .)回复于 2005-05-25 11:17:01 得分 0

顺道问个问题哈。  
   
  这个问题已经困扰我很久了我也尝试过了很多方法,但都未果,希望大家能指点一下方向。  
  问题是这样的:我想做个微软播放器全屏时上下两个彩色条,当鼠标移动时,它自动弹出,此时你可以控制暂停/播放等,当鼠标不动后一秒左右,它自动隐藏,我不知道他的那个彩色条是个什么控件之类的,能帮我看看吗?谢谢Top

42 楼miladuo(辞职ing)回复于 2005-05-25 11:34:37 得分 2

支持Top

43 楼ttfy1234(我自将心对明月,奈何明月照沟渠!)回复于 2005-05-25 13:49:17 得分 2

不知道该怎么申明作者名呢~~Top

44 楼vcleaner(我没当大哥很久了.......)回复于 2005-05-25 14:22:09 得分 0

建议共享一下资源哈[电子书]  
  ===============  
  如果哪位兄弟能提供FTP,本人将其上传,如果是发送邮件,那就算了,呵呵,新公司的管理比较严。  
   
  不知道该怎么申明作者名呢~~  
  ===============  
  使用:  
  CSDN   vcleaner   (我没当大哥很久了.......)Top

45 楼ricky20045(热情的沙漠)回复于 2005-05-25 14:25:03 得分 2

学习!收藏Top

46 楼MikeChen2003(asdghgdhf)回复于 2005-05-25 15:42:02 得分 3

markTop

47 楼Featured(我握着爱情的门票静静排队……)回复于 2005-05-27 21:47:01 得分 5

我甚是赞同楼主的观点,  
  事实上,我认为调试水平最能反映一个程序员的功力高低。  
  我的意思是,写点儿代码谁都会,关键是需要培养调试能力。Top

48 楼madoldman(疯癫叟)回复于 2005-05-27 22:20:28 得分 2

upTop

49 楼yujia120(永不停息)回复于 2005-05-28 01:27:48 得分 2

Top

50 楼luolovegui(骆归)回复于 2005-05-28 03:54:11 得分 2

jf,upTop

51 楼xlzxlich(阳光)回复于 2005-05-28 04:05:21 得分 10

赞同楼主的观点。  
  补充一句:一个设计良好的数据结构,会给程序设计和以后的调试带来事半功倍的效果。  
  一家之言,欢迎批评指正。Top

52 楼cxf1976()回复于 2005-05-28 08:56:51 得分 30

楼主的观点基本赞同。  
  不过遗漏了一个重要方面,汇编调试。  
  很多bug不进行汇编跟踪是看不出来的,比如有的bug在Debug版下没有问题,在release版下有问题,怎么办?手工下断点,进行汇编调试,找出 问题。还有一种情况,release程序正常运行,但在某个时刻发生异常崩溃,你怎么办?看drwtsn32的故障转储文件,也要分析汇编代码。  
  对于软件调试,如果不考虑软件逻辑/算法的问题,仅就软件本来说可以按照下面的步骤进行的:  
  代码调试(编译能否通过)-->内存调试(数据处理是否正确,堆栈是否正常)--->寄存器调试(寄存器内容是否正确)。  
   
   
  ...例如VC中的程序在Debug模式下为什么能发现数组访问越界?这是因为在Debug模式下,在分配数组所占用的内存时候,编译器在数组内存的两端 分别加入了一个字节的越界判断内存。这也就是为什么很多的MFC程序在使用自定义消息的时候在Debug模式下没有错误而在Release模式下发生错误 的原因了...  
  ----------------------------------------------------------------------------  
  我不知道数组越界的这种发现方法,据我了解一般是破坏堆栈后,引发GP错误,从而发现问题。不知道你说的这个字节的内容是什么?谁来判断?什么规则?  
  至于mfc消息的问题,在下觉得原因是函数实现出问题了,导致压栈错误。比如消息函数的本来原型是LRESULT   Onxxxx(WPARAM   w,   LPARAM   l),可是我们通常因为不需要参数传递,就简化为void   Onxxxx(),这样就会出问题的,mfc的机制对于自定义消息,要求两个参数,而现在没有,压栈的时候就会出问题。  
  一些个人看法,共同讨论。Top

53 楼cxf1976()回复于 2005-05-28 08:59:12 得分 2

另外强烈推荐VC,除了一些系统级调试不能做之外,其他的问题都可以解决。Top

54 楼celerityok(敏行)回复于 2005-05-31 16:21:16 得分 2

mark!Top

55 楼huyansoft(天蝎座)回复于 2005-06-05 15:59:36 得分 2

好贴,顶!Top

56 楼zengwujun(月之海 为linux入门奋斗100天)回复于 2005-06-05 16:07:11 得分 2

markTop

57 楼Tranquillo(晚起的鸟儿找虫吃)回复于 2005-06-05 19:07:45 得分 2

我觉得你自己写的程序没有理由调不好,就这么简单  
  当然前提是系统设计、模块组织合理,对调试工具熟悉,当然有些错误像数组越界很隐蔽,需要吃一堑长一智,编码和调试其实是一个有机整体,光管写不管能不能运行那叫编程吗?!Top

58 楼vcleaner(我没当大哥很久了.......)回复于 2005-06-14 09:11:44 得分 0

我不知道数组越界的这种发现方法,据我了解一般是破坏堆栈后,引发GP错误,从而发现问题。不知道你说的这个字节的内容是什么?谁来判断?什么规则?  
  ============================================  
  我的理解GP错误是针对操作系统的。在当前的操作系统下,每个进程有4G的进程空间,但是有相当一部分是不能直接有进程访问的,具体的分配参见 《Windows核心编程》,这时候如果访问了这个空间就会产生GP错误。但是数组越界缺不是这么回事,它访问的空间是仍然可以由进程访问的,但是无意间 越界了,这时候一般不会出现问题,只是响应的值可能是错误的,这种错误可以通过在数组两端设置两个越界的判断内存Byte来判断,具体就是在这两个 Byte中写入特别的数值,作为判断标志。具体原理和内容参考《零错误程序》!!  
   
  至于mfc消息的问题,在下觉得原因是函数实现出问题了,导致压栈错误。比如消息函数的本来原型是LRESULT   Onxxxx(WPARAM   w,   LPARAM   l),可是我们通常因为不需要参数传递,就简化为void   Onxxxx(),这样就会出问题的,mfc的机制对于自定义消息,要求两个参数,而现在没有,压栈的时候就会出问题。  
  =============================================  
  那你想过为什么在Debug模式下没有问题吗?同样也需要压栈!Top

59 楼vcleaner(我没当大哥很久了.......)回复于 2005-06-14 09:14:22 得分 0

欢迎象   cxf1976()   这样的同志参与,共同讨论,共同进步。大家也不要尽信我所说的一切都是正确的。即使现在是正确的也不能保证以后是正确的,毕竟一切都是在改变中的,编程的 基础就是OS所提供的API接口,OS的内核都在改变,没有什么是不改变的,呵呵。Top

60 楼vcleaner(我没当大哥很久了.......)回复于 2005-06-14 09:22:18 得分 0

关于数组访问越界,类似于下面的这个程序:  
  以下三条输出语句分别输出什么?[C易]  
  char   str1[]               =   "abc";  
  char   str2[]               =   "abc";  
  const   char   str3[]   =   "abc";    
  const   char   str4[]   =   "abc";    
  const   char*   str5     =   "abc";  
  const   char*   str6     =   "abc";  
  cout   <<   boolalpha   <<   (   str1==str2   )   <<   endl;   //   输出什么?  
  cout   <<   boolalpha   <<   (   str3==str4   )   <<   endl;   //   输出什么?  
  cout   <<   boolalpha   <<   (   str5==str6   )   <<   endl;   //   输出什么?  
  =============================  
  关于:  
  很多bug不进行汇编跟踪是看不出来的,比如有的bug在Debug版下没有问题,在release版下有问题,怎么办?手工下断点,进行汇编调试,找出 问题。还有一种情况,release程序正常运行,但在某个时刻发生异常崩溃,你怎么办?看drwtsn32的故障转储文件,也要分析汇编代码。  
  对于软件调试,如果不考虑软件逻辑/算法的问题,仅就软件本来说可以按照下面的步骤进行的:  
  代码调试(编译能否通过)-->内存调试(数据处理是否正确,堆栈是否正常)--->寄存器调试(寄存器内容是否正确)。  
  ===========================================  
  这个观点我是很同意的,但是现在有多少人能熟练使用汇编呢?我也不能。如果在Release模式下出现问题,可以使用MAP文件定位错误的位置。呵呵,参考:  
  http://www.vckbase.com/document/viewdoc/?id=908  
  http://www.vckbase.com/document/viewdoc/?id=1473Top

61 楼vcleaner(我没当大哥很久了.......)回复于 2005-06-14 09:24:11 得分 0

就象我帖子中所说的“有的时候多在网站上看看别人的经历也能有所收获。”建议大家到下面的URL去看看,仔细体会一下,肯定能学到很多东西:  
  http://www.vckbase.com/document/listdoc.asp?mclsid=23&sclsid=2303Top

62 楼icecools(浮生若梦)回复于 2005-06-14 09:44:44 得分 2

楼主有没关于WinDbg的资料啊?Top

63 楼vcleaner(我没当大哥很久了.......)回复于 2005-06-14 10:17:16 得分 0

WinDbg的帮助文件就很好了,呵呵,有时间仔细的看看!  
  你可以在MS的网站上下载WinDbg和相关的OS的调试符号。Top

64 楼vcleaner(我没当大哥很久了.......)回复于 2005-06-14 10:20:17 得分 0

也可以直接从vckbase下载:  
  http://www.vckbase.com/tools/debug/dbg_x86_6.2.13.1.exeTop

65 楼vcleaner(我没当大哥很久了.......)回复于 2005-06-14 10:42:24 得分 0

Windows   2000的调试符号和Windbg:  
  http://www.microsoft.com/Windows2000/downloads/tools/symbols/download.aspTop

66 楼Tray(Vaulting horse)回复于 2005-06-16 15:36:04 得分 0

markTop

67 楼Willpro(WillPro)回复于 2005-06-16 18:26:25 得分 0

markTop

68 楼jaunty_lau(夜上浓妆)回复于 2005-06-22 23:42:19 得分 0

楼主说语言的风格真让我感觉熟悉  
  哈哈  
  认识一下高人



转载地址: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1623220

阅读(3029) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册