<2024年3月>
252627282912
3456789
10111213141516
17181920212223
24252627282930
31123456

文章分类

导航

订阅

Debugging Principles

Debugging Principles
也谈1万小时定律
有段时间没写东西上来了。借口当然很多,一则是忙,二则是想让王宇的那个庆国庆的帖子多top些天:-) 其实想写的内容还是很多的。先和大家分享一个所谓的“1万小时定律”吧。 这个东西是有一天从报纸上看到的,<解放日报>,是的,老雷经常看解放日报,上海出的党报:-) 回到正题,这个定律来自一本名为Outliers的书,作者叫Malcolm Gladwell。简单来说,定律的主要内容是: 如果想要练成一门功夫,那么就要肯花1万小时;如果肯花了1万小时,那么功夫也就炼成了。不论是什么功夫,从体育,到音乐,到各行各业......普遍适用。 更多...

发布于 2009年10月31日 16:28Raymond9 篇评论

调试笔记:硬件损坏一例
几日前,一好友打来电话,他的台式机无法开机,电源键按下后,只听到风扇声音,显示器点不亮。故障发生的经过是,前一天晚上,他让杀毒软件开始扫描病毒,没有关机,第二天早晨发现机器无法唤醒,重新开机就像刚才说的那样。 听罢这个描述,我感觉这个问题比较严重,似乎遥控不太好解决了,加上与这个朋友好久未见面了,于是便决定“到现场”看一下。 经过一番“望闻问切(感兴趣的详见《程序员》杂志或者《<软件调试>补编》内容11,P146)”,我推断是主板坏了。原因有以下几个: 1)不插内存(RAM)时,也听不到任何鸣叫。对于正常的主板,没有内存时,CPU也会执行ROM中的自检代码,发现没有RAM后就会以Beep 更多...

发布于 2009年4月15日 22:17Raymond6 篇评论

正心诚意,格物致知
今天想和高端调试的朋友们做一个深层次的分享。如何在坚持技术方向的前提下做的很成功。 第一、要倡导技术氛围。这个道理很简单,因为你是做技术的,只有提高技术方面的话语权和影响力,你才有话语权。这个社会中,有些人贡献了80%,但只得到了20%,有些人贡献了20%,但是得到了80%。大多数做技术的,都是属于贡献80%的这一类。如何让做技术的得到的更多,需要所有做技术的人来努力,为自己,为同行争取更多的权利。 第二、不要做印度青蛙,要推动你的朋友,而不是看到他即将成功的时候把他拉下来。现实生活中,真的看到很多印度青蛙。他们自我膨胀,容不得身边的人比自己强,想方设法打击自己的战友。 更多...

发布于 2008年11月20日 22:44Raymond7 篇评论

WinDBG扩展命令的工作原理
要理解WinDBG扩展命令的原理应该先理解WinDBG软件的架构,下图是以模块为单位所画出的架构示意图。最上层是四个EXE模块,它们提供了不同形式的用户接口,简称UI层。中间是调试引擎模块,它是WinDBG调试器的核心模块,大多数调试器的工作逻辑都包含在这个模块中。调试引擎下面是几个支撑模块。内核态的部分是操作系统提供的调试支持。 因此以调试引擎为中心,向上看是调试器与用户的接口,向下看便是与系统的接口。调试器作为一种相对独立的软件产品,保持其核心代码的稳定性和广泛的适用性是很重要的。像WinDBG这样的调试器,它要支持很多种版本的内核和应用程序,因此,保持这两个接口的稳定性是很重要的。向下的接口基本上是靠API的稳定性来保证的。 更多...

发布于 2008年10月13日 20:41Raymond7 篇评论

亲历误删......
昨天中午,一个朋友打电话给我说他的XP系统“开始”菜单不见了。询问了他一番后,感觉确实出了什么问题,可能是explorer程序(explorer.exe)被插件搞乱了,或者中其它招了。 晚上又收到他的电话,显然比中午更加焦急,说系统进不去了。完整的故事是,他使用了某种【隐去真名,不想引来不必要的争议】杀毒软件,杀毒软件“确实”发现了问题,并提示要执行删除动作,他发出确认命令同意这么做了,而后重启,但是再也起不来了,XP的启动进度条滚了一阵后,是杀毒软件的Splash,而后便是黑屏,黑屏持续几秒后,自动重新启动,如此往复不已。 更多...

发布于 2008年9月25日 22:22tudouni3 篇评论

[WinDBG]新闻组拮趣之私有符号
在Windows底层开发圈里,OSR的几个邮件新闻组很是有名。具体来说就是讨论调试的windbg,讨论一般驱动开发问题的ntdev和讨论文件系统有关问题的ntfsd。 浏览这些新闻组的邮件是我闲暇时的一件乐事。除了可以了解信息、学到一些知识和技巧外,还可以提高英文,领略地道的美式幽默,或者看如何用英文“发牢骚”和“斗嘴”。 很早就想把阅读这些新闻组的收获写成短文与大家分享,但是都没有真正实施。今天算做这个系列的正式开始吧! 首先,一位名为Joe的先生发出信息求助,遇到的问题是找不到可以用于Server 更多...

发布于 2008年9月24日 22:16Raymond1 篇评论

D1蓝屏、指针和安全的代价
在从Hibernate恢复时,发生D1蓝屏,蓝屏的基本信息为: DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1)An attempt was made to access a pageable (or completely invalid) address at aninterrupt request level (IRQL) that is too high.  This is usuallycaused by drivers using improper addresses.If 更多...

发布于 2008年9月14日 17:31Raymond0 篇评论

深夜杂感
《软件调试》面世后,得到了很多读者的好评,这是我写作这本书得到的最大快乐和收获。但是最近在China-pub网站上,却有人不断的挑剔,首先是批评定价高。我尝试做了几次解释,但是无济于事,于是决定不予理睬,省下时间做些更有意义的事。 但是今晚我意外的看到,有人在批评David所写的序言,指责David“没怎么看的书也作序推荐”,而且对David使用了很粗劣的语言。看了这样的评论后,我真的很气愤。思考良久,做了如下回复: “David是在看了详细的英文目录和简介后写了上面的短评。他写的都是客观的事实(包括覆盖面、篇章结构、深度等在详细的三级目录中都是可以看得出的呀)和他的感受。我和David的交往并不很多,在他看了书的初步框架后,他就对书的内容很感兴趣,乐意为这本书写序,今年4月书即将完成,我又给他写信时,另外意外的是,他竟然说在他的Outlook里已经有了一个reminder。我想他这样的名人能动笔主要是因为这本书的主题吸引了他。凭借他的资历,他早已认识到了调试的重要性。他对自己感兴趣的东西说几句话何过之有?至于这本书到底怎么样,你完全可以自己来判断,可以看样章,也可以参考其他读者的讨论(http://advdbg.org/forums/75/ShowForum.aspx)。David是国际知名的操作系统专家,备受世界各地技术人员的尊重,不知你资历如何,竟对他出言不逊?难道他不懂中文,你就可以轻易使用中文的词汇来骂他么?语种的差异其实很多时候并不是障碍,真诚和至善很容易打破这个障碍,同时这个障碍也遮不住低俗和丑恶。” 更多...

发布于 2008年8月16日 0:50Raymond12 篇评论

内核调试的EXDI方式
除了串行口、1394和USB 2.0这些链接方式外,WinDBG还支持一种很特殊的连接方式来做内核调试。这种方式被称为EXDI,通常写为eXDI。简单来说,EXDI是WinDBG与硬件调试器协同工作的一个接口。 《软件调试》的第7章介绍了JTAG调试协议和Intel CPU的JTAG支持,即ITP/XDP接口。ITP调试器借助专用的硬件设备(ITP调试仪)通过CPU的专用信号引脚与CPU通信,实施调试任务。 ITP/XDP调试器都有自己的软件,可以观察内存、设置断点、接收CPU的事件等。但如果使用ITP调试器调试Windows操作系统或者其中的驱动程序时,一个明显的问题便是难以处理调试符号和支持操作系统相关的观察功能,比如WinDBG的那么多个扩展命令所提供的功能。于是,一种很自然的想法便是把ITP调试器当作一种读写数据的特殊连接方式,让其为WinDBG传递数据。 更多...

发布于 2008年8月6日 21:30Raymond1 篇评论

Vista的启动调试
在Vista之前,NTLDR是Windows操作系统的加载程序,它负责将CPU从实模式切换为保护模式,加载内核文件和启动类型的驱动程序,然后把执行权交给内核文件的入口函数,即KiSystemStartup。 从要完成的任务角度来看,NTLDR内部又分为两个部分,一部分负责接受执行权,做模式切换,硬件检查,即启动的准备工作,这部分通常称为boot;另一部分负责加载内核文件,并为内核的运行做必要的准备,通常称为OsLoader。 Vista将以上两个部分分成两个独立的程序文件,即BootMgr和WinLoad.exe。下图描述了BootMgr和WinLoad的相互关系和它们在启动过程中的作用。 更多...

发布于 2008年7月28日 21:54Raymond4 篇评论

汇编与反汇编之小技巧
大家都知道,对于位于当前调试目标中的指令,可以使用WinDBG的u命令进行反汇编。u命令的参数是要反汇编代码的地址值或者符号,如果不指定,那么WinDBG会使用当前程序指针寄存器所指向的代码,例如: 0:001> untdll!DbgBreakPoint:7c901230 cc              int     37c901231 更多...

发布于 2008年7月3日 22:34Raymond2 篇评论

《软件调试》与《Windows高级调试》比较之我见
   我是在2007年11月听说Advanced Windows Debugging(姑且翻译为《Windows高级调试》,简称AWD)这本书的。一个朋友和我说有一本书和你在写的书很相似,已经要出版了。朋友这样说当然是好意,防止我白费功夫重复劳动。或者用英文说就是不要“Reinvent the wheel(重复发明轮子:-))”,其实中文也有很多类似的冷语,比如“吃人家嚼过的馍”,其讽刺度之深比重新发明轮子还恨。我初听这个消息当然为之一振,可不想自己写了两年多(当时已经两年多)的东西与别人的一样。当晚我便GOOGLE了这(AWD)本书,当时在AMAZON上便有该书的预报,有章节目录。把章节目录看了两三遍后,我的担心慢慢散去了。从目录框架显然可以看出,AWD与我的《软件调试》大不一样。于是这个小“震动”只影响了我几个小时后,我便继续投入到《软件调试》的工作了,当时《软件调试》的第一稿也已经完成,在编辑和审阅第二稿的过程中。 更多...

发布于 2008年6月9日 9:53Raymond3 篇评论

《软件调试》的主页
《软件调试》于上周进入工厂印刷,第一本有望在本周装订完成。第一本审查无误后,那么第一批600册将在下周完成! 同时,《软件调试》的主页也初步建成,网址为http://advdbg.org/books/swdbg/。欢迎大家访问和提宝贵意见!   更多...

发布于 2008年5月27日 23:31Raymond8 篇评论

迎接2008!
2008年的第一天,阳光灿烂!对于上海这个多阴多雨的城市,这冬日的阳光着实是为新的一年送了一份厚礼! 每个人对新的一年都会有很多期待,北京奥运会无疑是最有共性的一个。于我,《软件调试》的出版是第一号的期待。一些热心的朋友也在期待这本书,他们的期待是我的动力。 以下是《软件调试》一书的主要内容,全书共30章,分为六篇。 第一部分:绪论(第1章)作为全书的开篇,这一部分介绍了软件调试的概念、基本过程、分类、和简要历史,并浏览了本书后面将详细介绍的主要调试技术。 第二部分:CPU的调试支持(2~7章)CPU是计算机系统的硬件核心。这一部分以IA-32 更多...

发布于 2008年1月1日 10:21Raymond5 篇评论

它山之石,可以攻玉
泰克(http://www.tek.com/)是全球著名的测试测量仪器生产厂商,它的最著名产品是示波器。从调试的角度来看,示波器对于硬件工程师来说就好像是软件工程师使用的调试器。 在硬件领域,已经形成了一个不算太小的产业来专门生产以示波器、逻辑分析仪为代表的测试和调试设备,人们愿意以高昂的价格来购买这些设备,厂商们也不断的加大投入来研发更好、更先进、价格也更昂贵的设备。 与硬件领域相比,软件领域中人们对调试的重视真是天壤之别。著名的SoftICE在去年宣布停止开发了(看高手们对此是多么伤心http://blogs.msdn.com/matt_pietrek/archive/2006/04/07/570927.aspx)。Syser的开发还在维持,但是开发者最大的顾虑不是技术难度,而是客户太少。 更多...

发布于 2007年11月28日 20:14Raymond0 篇评论

让WinDBG显示自己的调试信息
WinDBG是个调试器,但其本身也是个软件,也有BUG,这就好像医生也会生病一样。如何调试WinDBG呢?WinDBG的设计者们早考虑到了。比如.dbgdbg命令就是启动一个调试器来调试当前的调试器。 再如,使用.outmask命令可以让WinDBG输出自己的调试信息。参数可以是下表中的各个标志位的组合。 Value Default setting Description 1 On Normal output 2 On Error output 更多...

发布于 2007年7月30日 12:51Raymond0 篇评论

通过XP的新命令行工具查询DRIVER信息
Windows XP附带了一个很好的小工具driverquery,使用它可以很轻松的查询出本机或远程系统中的驱动信息。尤其是给系统管理员和驱动程序开发人员带来了很大方便。 Driverquery是个控制台程序,位于Windows系统的system32目录下(大小50多K),因此你可以在任何控制台窗口运行它。 不带任何参数,便可以列出目前系统中已经加载的所有驱动,是按名字列出的。 Module Name  Display Name           更多...

发布于 2006年5月12日 22:21Raymond0 篇评论

调试笔记:BSOD 0xA
Stop A (IRQL_NOT_LESS_OR_EQUAL ) 是比较多见又难以解决的一个内核问题。本文以一个真实例子对其稍加分析。 首先把内核转储文件调入到WinDbg中,并使用!analyze -v了解概况如下: IRQL_NOT_LESS_OR_EQUAL (a)An attempt was made to access a pageable (or completely invalid) address at aninterrupt request level (IRQL) that 更多...

发布于 2006年5月12日 22:12Raymond0 篇评论

Windows全局标志(Gflags)
Gflags Flag Reference 摘自TechNet,原始链接为:http://technet2.microsoft.com/WindowsServer/en/Library/6a183942-57b1-45e0-8b4c-c546aa1b8c471033.mspx Buffer DbgPrint output Abbreviation ddp Hexadecimal value 0x08000000 Symbolic Name 更多...

发布于 2006年5月4日 17:58Raymond0 篇评论

BlackHat的高端培训
BlackHat的历年高端培训资料: http://www.blackhat.com/html/bh-media-archives/bh-multi-media-archives.html#USA-2005 将由微软的两个人(Jason Geffner & Scott Lambert)deliver的培训: http://www.blackhat.com/html/bh-usa-06/train-bh-us-06-sl-advmal.html 大家有空时慢慢挖掘吧,其中有用的内容应该不少 更多...

发布于 2006年4月23日 10:52Raymond0 篇评论

"checked" build 和"free" build的来历
Where do "checked" and "free" come from? By Larry Osterman People who have MSDN or the DDK know that Windows is typically built in two different flavors, "Checked" and "Free".  The primary difference between the two is that the "checked" build 更多...

发布于 2006年4月18日 14:24admin0 篇评论

KeBugCheck2的第6个参数
大家知道,DDK公开了两个内核API用于产生BSOD,分别是KeBugCheck()和KeBugCheckEx()。其原型分别如下: VOID   KeBugCheck(IN ULONG  BugCheckCode    ); VOID   KeBugCheckEx(IN ULONG BugCheckCode,    IN ULONG_PTR  BugCheckParameter1,    更多...

发布于 2006年3月13日 10:38Raymond1 篇评论

WinDbg不同版本间的主要差异
近一两年来,WinDbg的版本更新差不多每月都有,这种速度也侧面证明了微软内部对WinDbg的重视,否则不会升级这么快吧?而且可以看出其发展是和微软的其它技术发展同步的。比如DotNet热时WinDbg的那几个版本加了很多对调试托管代码的支持,64位热时,WinDbg便加入对WOW64的支持。无疑微软的很多内部团队也在使用WinDbg做调试。当他们发现问题或有新的要求时就会让WinDbg改正或加入。 版本升级这么快,有时真的不知道每个版本到底有什么变化,该不该升级?还好微软的站点上有一个简单的列表关于每个版本的变化。但这个LISt已经不包括6.2以前的版本(大约是05年3月)了。说不定现在包括的版本过几个月也不见了。赶紧贴过来吧! 更多...

发布于 2006年3月7日 2:35admin1 篇评论

关于驱动开发的几个必读BLOG 票数 优秀 [5 out of 5]。
对于从事Windows驱动开发的朋友,或者是对Windows内核感兴趣的朋友,以下几个BLOG值得经常看看! 1,Kernel Mustard by Steve Dispensa link: http://kernelmustard.com/category/ddk/ 他以前的BLOG地址为:http://msmvps.com/blogs/kernelmustard/default.aspx 2,Larry Osterman's WebLog - Confessions of an 更多...

发布于 2006年3月2日 14:52admin1 篇评论

学习软件调试原理的意义
曾经一度我面试应聘者的一个问题就是调试断点的工作原理,令我非常遗憾的是,无论是刚毕业的本科生或研究生,还是有多年工作经验的老程序员,都未能给我一个满意的答案。 当我与一些朋友聊起这个话题时,我遇到一种说法,令我深思。这种说法是我知道这个有什么意义呢? 是啊,现今是个知识爆炸的年代,新技术、新理念层出不穷,我们必须有选选择,目标明确的取舍自己的学习和努力方向。 但是,在这个前提下,我仍然认为调试原理是每个程序员的一门必修课。这不是我的一家之言,很多资深的行业专家,他们也在各种场合发表过类似的观点。 更多...

发布于 2005年10月13日 22:49dbg2 篇评论

Powered by Community Server Powered by CnForums.Net