调试手段的重要性是“怎么强调也不为过”_格蠹汇编书评-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 编程 > 格蠹汇编 > 调试手段的重要性是“怎么强调也不为过”
不欺售欺 格蠹汇编 的书评 发表时间:2016-11-26 12:11:11

调试手段的重要性是“怎么强调也不为过”

国内有关计算机的书能达到9分以上的很少了,我非常热爱的《数学之美》都没有到9分,这本书做到了。国内计算机类的书并不是说不好,而是我们的同胞对国内的技术书和国外的技术类书的评分标准不一样,对国内的产品要求总要苛刻一点,国外的月亮总要圆一点。看翻译版的国外技术类书,翻译的不好全都是翻译者的锅,翻译的好全都是作者的好;至于英文原本的书,除了几本经典的,很多都有过誉的现象,英文版的书能做到语言简洁简单,条理清楚,结构清晰,文笔信雅,内容丰富的书并不多,<Computer Systems: A Programmer's Perspective>算一本符合这种高标准的书,堪称完美的书,怎么称赞都不为过,看完这本书我还误以为CMU大学的教材都有这么好,难怪他们的毕业生都强悍的一塌糊涂,因此还强烈引发了我找同类似的数学类的教材的动力,结果遗憾的是并没有找到。所以总结起来,国内计算机类的书能达到9分的,算是能封神了。作为张老师的一生粉,当然需要强烈推荐这本书了。

先说Debug的重要性。无论学哪门计算机语言,Debug算是必知必会的一项技能,不会debug,语言也学不成了,随着学习的深入,Debug的技能的要求也就越高,需要分析的问题也越难,需要分析Hang/Freeze, Memory leak, Performance, Hard to reproduce, Crash, Weird Result等。高到最后当然就是无视语言了,只剩下操作系统,CPU,和汇编(至于除CPU以外的硬件,先不考虑其Debug的技能)。Debug不仅可以作为纠错的工具,还能应用在安全领域,最重要的是如作者所说,可以用来学习,可以用来认识和感知计算机的软件世界。在这里借用书中的话来强调下Debug的重要性:
”毛德操和胡希明教授在他们所著的《嵌入式系统》一书中这样说:在软件开发的“生命周期”中,程序调试(debug)以及调试手段的重要性是“怎么强调也不为过”的。推而广之,对软件工程师来说,调试器是征服计算机世界的宝剑,花再多功夫练习这门剑法都是值得的。使用这把宝剑来帮助学习,可以深入精髓,直击本质,而且生动鲜活,乐趣盎然。这把剑几乎是无所不能的,使用它可以降伏桀骜不驯的软件,也可以观察看似错综复杂的硬件。总之,可以用它认识和指挥计算机系统,征服这个世界。“

再说本书的价值。这本书的中文名实在是容易让人误解,能把格蠹这两个字读出来就算不错了,我也要感谢高中的应试教育让我学了个成语叫做流水不腐,户枢不蠹,不然这本书的书名逼格都高到读不懂。后面两个字更是让人误解,这也让我也一直以为误这本书是讲述汇编语言知识的,虽然知道是张老师的书,但是一直忍着没买来看;虽然有个副标题,但是副标题我往往都不怎么注意啊。这本书的英文名倒是挺好的叫做Debugging Wars,要是这本书的英文名作为主书名的话,估计倒是能吸不少粉。有缘了解到这本书还是因为有一天我有个同事拿着这书问我怎么解读栈上的内存,这时候我才了解到这是一本关于调试的书啊,而且内容还这么有趣。后来看了前言才知道书名中的“汇编”是指很多案例汇集在一起,不得不说书名误人啊。

没有对比就没有伤害,但我喜欢伤害,所以我对比下张老师的这本和我看过的其他的关于调试的书。首先对比的是张老师的这本和张老师的另一本《软件调试》,软件调试算是一本理论值爆表的书,大部头妥妥的,能啃下来的都是勇士,惭愧的是我没啃下来,只是当作工具书来查。这本书相对于《软件调试》来说偏向于实践,倾向于技巧,该书也薄不少,但胜在内容生动有趣,学习成本低,能给人很强的关于计算机理论主观印象。张老师的这两本都是强强之作,难得的好书,很庆幸的是这两本书都是中文原版的,省却了我看英文版的痛苦。关于英文版的看过<Advanced .NET Debugging>和<Memory Dump Analysis Anthology(volumn1)>,我也翻看了豆瓣上对这两本书的评价,评分者甚少。可能是因为很少有人像我这么无耻在下载着盗版看吧,毕竟英文原版的书还是挺贵的。对于<Advanced.NET.Debugging>是关于调试.NET相关的程序的,我个人认为是C#开发人员必看的系列了,也是一本很好的书,虽然C#的Debug很简单,但是有必要看看这本书系统的学习一下Debug方面的知识。
至于<Memory Dump Analysis Anthology(volumn1)>(后面简称为MDAA)我只看了卷一,这本书关于case study的典型书,跟本书的前两个部分很类似。MDAA作者的文笔有点差强人意,有的地方逻辑非常拗口难懂,也能见到作者突然一个UML图画出来,然后什么解释都没有,就开始讲述怎么Debug了,经常看的我一脸懵逼,但是不得不说作者的功底也非常深厚,调试经验丰富,奇淫技巧让我等小辈膜拜,虽然文笔差强人意,但是技术类的书,尤其是这种Case Study的书,谁TM在意这些呢,瑕不掩瑜,也值得推荐。

另外这本书还有一个很大的价值就是作者编写了很多程序或者保留出来dump供读者动手操作,一直也觉得亲自动手的能力在软件行业技能中占很大的比重,作者在本书中不遗余力地促导读者的动手,这份细心和操心无与伦比啊。

最后说说该书的内容,这本书其实对读者也是有一定的知识储备要求的,对Windbg,汇编,线程栈,系统知识都需要有一定的了解,当然了解不多也没关系,毕竟什么时候都可以临时离开一会儿进行恶补一番。整体上说,这本书分为四个部分:笃行;明辨;器用;致知。其实在我这个俗人眼中,完全不用分为四部分,两部分就好了,第一部分是1~18章中的Case Study,第二部分是19~36章的Tool Study。
第一部分侧重于调试的技巧,在学调试方法的路上顺便把理论也给学了,例如:P34 谁动了我的甜饼一节,告诉读者怎么读取Cookie,顺便讲述了Cookie的压入栈的位置;在P76 死锁 一节,在死锁的同时,顺便轻轻松松把CriticalSection讲解的非常清晰,借用一下书中的原话:
“LockSemaphore字段记录的是这个关键区对应的事件对象,当有线程需要等待这个关键区时,便等待这个事件对象,这个事件对象是按需要创建的。如果LockSemaphore字段为空,则意味着这个关键区非常“流畅”从来没有线程在此等待过。 ”
另外作者的调试技巧也深入人心,比如在第7章 就讲述了怎么调试挂掉的Session 为0的进程,简直神来之笔,如管中窥豹,可见一斑。
还有112页的断点技巧“bp KERNELBASE!CreateFileW+0x5 "dU /c 50 poi(@ebp+8); gc",让我没想到断点还可以这么神奇的打下去不用自己手动处理中断后的步骤。
对于第二部分,更侧重的是调试的原理,偏向于工具方面的讲解多一点,这里面也能看到作者的调试思路,也有作者善于钻研,喜欢追根究底的极客精神。值得学习的地方不止书上的不止作者的内容,作者的钻研精神更值得我们学习。

另外讲调试不能偏离代码本质,调试虽然重要,代码确是其根基,作者对代码能力也推崇之至,文中有两处提到代码的重要性了,分别在P124和P298。最后借用作者的一句话结束:写代码就像写文章一样,是值得修炼一生的技艺。对于一位软件工程师来说,提高对代码的感知力和控制力是无止境的。

愿在软件行业贡献自己的一生,愿与君共勉!

展开全文


推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读