程序员调试能力和相关书籍

 
楼主vcleaner(我没当大哥很久了.......) 2005-05-23 09:09:42 在 VC/MFC / 基础类 提问

在软件行业中,个人觉得每个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

src="/Include/Board.htm?Tags=函数,程序员,语句,内存,编码,逻辑,汇编,断点,vc,debug" frameborder="0" scrolling="no">

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

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

linux内核调试分析指南 linux内核调试分析指南--上篇 本文档已经转到下面的网址,位于zh-kernel.org的文档停止更新,请访问新网址 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 建立调试环境 发行版的选择和安装 安装交叉编译工具 bin工具集的使用 qemu的使用 skyeye的使用 UML的使用 vmware的使用 initrd.img的原理与制作 x86虚拟调试环境的建立 arm虚拟调试环境的建立 arm开发板调试环境的建立 gdb基础 基本命令 gdb之gui gdb技巧 gdb宏 汇编基础--X86篇 用户手册 AT&T汇编格式 内联汇编 汇编与C函数的相互调用 调用链形成和参数传递 C难点的汇编解释 优化级别的影响 汇编基础--ARM篇 用户手册 调用链形成和参数传递 源码浏览工具 调用图生成工具 find + grep wine + SI global Source-Navigator vim + cscope/ctags kscope lxr SI等与gdb的特点 调用链、调用树和调用图 理想调用链 函数指针调用 调用链的层次 非理想调用链 调用树与调用图 穿越盲区 穿越gdb的盲区 穿越交叉索引工具的盲区 工程方法 bug 与 OOPS linux内核调试分析指南--下篇 ***第二部分:内核分析*** 内核组织层次和复杂度 内核层次 内核复杂度 复杂度隔离 gdb在内核分析中的用途 数据验证 界面剥离 参数记忆 路径快照 长程跟踪 整理思路 内核编码的艺术 信息聚集 数据聚集 关系聚集 操作聚集 松散聚集 顺序聚集 链表聚集 哈希聚集 树形聚集 分层聚集 分块聚集 对象聚集 设施客户 设备驱动模型分析 linux设备子系统的组成 设备驱动模型 usb子系统分析 如何阅读分析大型子系统 btrfs文件系统分析 区间树核心代码分析 B树核心代码分析 调试相关子系统 kgdb源码分析 sysrq oprofile kprobes 驱动分析 载入模块符号 ***第三部分:其他工具*** kexec strace ltrace SystemTap MEMWATCH YAMD Magic SysRq 附录:社区交流相关 补丁提交相关文档 补丁制作与提交示范 多补丁发送工具 git使用 Git公共库创建及使用 附录:内核参考书籍文章 内核git库 书籍 子系统官方网站 必看网站 参考文章 私人备忘
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值