Debug War
Debug War in Real World
【本文曾发表在《程序员》杂志的调试之剑专栏中】
现代人生活在重重压力中,有时压力太大无法忍受时,便以疯狂的方式来释放压力,有的大喊大叫,有的打人骂人,也有动刀动枪的……其实软件世界也有类似的问题,随着软件被应用到越来越多的重要岗位,人们对软件的期望也越来越高:要长的漂亮,有华丽的外表;要跑的快,反应神速;要功能强大,啥都能干;要灵活通用,能在所有带CPU的盒子上跑;要坚韧鲁棒,能适应千差万别的使用环境;要开放,能以有线无线、局域网、互联网等各种方式通信;而且还要安全,铜墙铁壁,百毒不侵……看看人们对软件的这些要求,您说软件的压力大不大?在如此重负下,软件也难免会有“发疯”的时候。
更多...
这是刚刚发生的一个故事,笔者亲历。
因为年底一个月很忙碌,所以久未写博客了,这几天放假,略有空闲,于是想写点东西出来,一来练练手,免得本来就不熟练的文笔变得更加生疏;二来与大家交流一下,免得朋友也生疏了。于是上网,打开网页,准备写个短文。写什么呢?这几天放假,就写点闲话吧,放假前去了次闵行老街,就写这个吧,怀怀旧。:-)
写文章不是件简单的话,很多时候的确像赵本山说的那样,半天憋不出俩字。:-)于是乎,就一篇简简单单的《重访闵行老街》,前前后后也用了几个小时。当然中间有一些停顿,有时陪女儿玩一会,有时喝杯茶,这样到中午时,基本写好了,检查一遍就可以发出去了;但中饭时间到了,女儿强烈要求煮意大利面给她吃,于是只好把写完大半的文章放下了。
更多...
有段时间没写东西上来了。借口当然很多,一则是忙,二则是想让王宇的那个庆国庆的帖子多top些天:-)
其实想写的内容还是很多的。先和大家分享一个所谓的“1万小时定律”吧。
这个东西是有一天从报纸上看到的,<解放日报>,是的,老雷经常看解放日报,上海出的党报:-)
回到正题,这个定律来自一本名为Outliers的书,作者叫Malcolm Gladwell。简单来说,定律的主要内容是:
如果想要练成一门功夫,那么就要肯花1万小时;如果肯花了1万小时,那么功夫也就炼成了。不论是什么功夫,从体育,到音乐,到各行各业......普遍适用。
更多...
以下是Vista的VGA驱动程序发起调用BIOS的显示服务(INT 10)时系统模拟执行实模式代码的过程(栈回溯)。以Xm开头的那些函数是HAL中专门用来实现模拟功能的。
kd> kPL 100
ChildEBP RetAddr
803d0a1c 828c250c nt!RtlpBreakWithStatusInstruction
803d0a24 828c24be nt!KdCheckForDebugBreak+0x22
803d0a44 828c202d nt!KeUpdateRunTime+0x271
更多...
朋友的电脑出了一个“怪”毛病,当使用资源管理器的时候,冷不丁会跳出一个非法访问对话框(其实就是应用程序错误对话框,也称GPF对话框),点击确定按钮关闭后,Explorer进程便会退出,然后重启,导致开始菜单和任务栏也消失片刻后再出现。
在把WinDBG设置为JIT调试器后,重现问题,于是WinDBG被自动唤起。崩溃现场的信息如下:
(680.c4c): Access violation - code c0000005 (first/second chance not available)eax=00000000
更多...
几日前,一好友打来电话,他的台式机无法开机,电源键按下后,只听到风扇声音,显示器点不亮。故障发生的经过是,前一天晚上,他让杀毒软件开始扫描病毒,没有关机,第二天早晨发现机器无法唤醒,重新开机就像刚才说的那样。
听罢这个描述,我感觉这个问题比较严重,似乎遥控不太好解决了,加上与这个朋友好久未见面了,于是便决定“到现场”看一下。
经过一番“望闻问切(感兴趣的详见《程序员》杂志或者《<软件调试>补编》内容11,P146)”,我推断是主板坏了。原因有以下几个:
1)不插内存(RAM)时,也听不到任何鸣叫。对于正常的主板,没有内存时,CPU也会执行ROM中的自检代码,发现没有RAM后就会以Beep
更多...
在XP SP2系统中,打开一个WORD文件时,WORD启动后便失去响应,而且无法杀掉这个进程。这种情况通常是挂在内核态了。
以下是使用Ctrl+ScrollLock触发蓝屏后,分析转储文件的概要信息。
观察WinWord进程的唯一线程,其情况如下:
kd> !THREAD 885eb468THREAD 885eb468 Cid 11ac.106c Teb: 7ffde000 Win32Thread: e248a770 WAIT: (Executive) KernelMode
更多...
Windows 7(Win7)是Windows操作系统的下一个客户端版本,计划在明年中正式发布。在前不久的WinHec上,每个参会者都得到了一份Win7的预览版本,是比Beta版本还早的所谓Milestone 3(M3)版本。
老雷曾经说过他是使用调试器来了解和学习操作系统的。但到底可以怎么用调试器来帮我们了解新的操作系统或者它的新版本呢?这个系列文章就想以这种方法来学习一下Win7。今天是第一个部分,到底写多少次还没有计划,如果大家喜欢,老雷写的高兴,那么就一直写下去,不然可能就这一篇。
首先该介绍一下道具(工具),第一,当然少不了WinDBG,老雷机器上有从WinDBG2.x开始的n个版本,但大多数时候用的还是6.X。第二,要有目标机来运行Win7,为了可以随时唤出来把玩,我还是把它运行在虚拟机里,用的是VPC2007。第三,要有一些附属的小工具,比如观察符号的SymView小工具,触发异常的I'm
更多...
《软件调试》出版后,有不少热心的读者以各种方式报告了书中的错误(列在勘误中)。对于这样的报告,每次看的时候,首先是感觉很惭愧,怪自己的疏忽大意和水平有限。惭愧后聊以安慰自己的是有读者在仔细看自己写的东西,比石沉大海悄无声息要好。
前几天收到出版社通知,第一次印刷的5000册(确切说是5050册)即将售完,准备做第2次印刷。于是首先想到的是要把书中存在的错误和问题改正过来。
今天特意发出这个征错启事,希望大家把发现的问题以你喜欢的方式报告出来,发邮件、发帖子都可以,错误和建议都可以,尽管发出来,别手软:-),凡是报告错误的,都会赠送一份《软件调试》删节内容的电子版本,以表感谢。要说明的一点是,这次只是重印,与再版不同,只能做小改动,不能大改。
更多...
今天想和高端调试的朋友们做一个深层次的分享。如何在坚持技术方向的前提下做的很成功。
第一、要倡导技术氛围。这个道理很简单,因为你是做技术的,只有提高技术方面的话语权和影响力,你才有话语权。这个社会中,有些人贡献了80%,但只得到了20%,有些人贡献了20%,但是得到了80%。大多数做技术的,都是属于贡献80%的这一类。如何让做技术的得到的更多,需要所有做技术的人来努力,为自己,为同行争取更多的权利。
第二、不要做印度青蛙,要推动你的朋友,而不是看到他即将成功的时候把他拉下来。现实生活中,真的看到很多印度青蛙。他们自我膨胀,容不得身边的人比自己强,想方设法打击自己的战友。
更多...
他1979年加入英特尔,是286和386设计团队的关键成员,80486的最初架构师。
1986-1989年他担任80486团队的设计经理。1989-1992年,担任负责设计Pentium Pro的部门(division)的总经理。
目前他是英特尔公司的高级副总裁(VP),DEG(Digital Enterprise Group)Group的总经理。
他便是帕特·基辛格(Pat Gelsinger)。很多人可能听说过Programming the 80386这本书。他的两位作者之一便是帕特。
更多...
我们把调试过程对被调试程序所产生的影响称为海森伯效应(详见《软件调试》28.6.1)。设计调试工具时,当然应该努力降低可能的海森伯效应,以便可以在调试器中调试时看到的症状与没有被调试时是一样的。
但正像这个名字的由来(海森伯的测不准原理)那样,海森伯效应一定是存在的。只不过是很小,大多数时候都不会对我们的调试造成明显的影响。
前两天,jlflyfox提出了一个问题,这个问题其实是一种非常典型的海森伯效应。
为了讨论简单,可以使用下面的代码来重现jlflyfox所提出的问题。
/*--------------------------------------------------------------
更多...
要理解WinDBG扩展命令的原理应该先理解WinDBG软件的架构,下图是以模块为单位所画出的架构示意图。最上层是四个EXE模块,它们提供了不同形式的用户接口,简称UI层。中间是调试引擎模块,它是WinDBG调试器的核心模块,大多数调试器的工作逻辑都包含在这个模块中。调试引擎下面是几个支撑模块。内核态的部分是操作系统提供的调试支持。
因此以调试引擎为中心,向上看是调试器与用户的接口,向下看便是与系统的接口。调试器作为一种相对独立的软件产品,保持其核心代码的稳定性和广泛的适用性是很重要的。像WinDBG这样的调试器,它要支持很多种版本的内核和应用程序,因此,保持这两个接口的稳定性是很重要的。向下的接口基本上是靠API的稳定性来保证的。
更多...
在Windows底层开发圈里,OSR的几个邮件新闻组很是有名。具体来说就是讨论调试的windbg,讨论一般驱动开发问题的ntdev和讨论文件系统有关问题的ntfsd。
浏览这些新闻组的邮件是我闲暇时的一件乐事。除了可以了解信息、学到一些知识和技巧外,还可以提高英文,领略地道的美式幽默,或者看如何用英文“发牢骚”和“斗嘴”。
很早就想把阅读这些新闻组的收获写成短文与大家分享,但是都没有真正实施。今天算做这个系列的正式开始吧!
首先,一位名为Joe的先生发出信息求助,遇到的问题是找不到可以用于Server
更多...
《软件调试》的第2篇是CPU的调试支持,由第2~7章组成,共有136页,是全书的第一个核心部分。写作和阅读这一篇的主要目标有如下几个:
介绍大多数软件工程师需要补充的CPU基础。
CPU对软件调试核心功能的支持。
CPU对软件调试扩展功能的支持。
CPU中用于调试系统故障和自身问题的设施。
现代CPU和集成芯片所使用的硬件调试方案。
针对以上目标,第2、3章是满足目标1的,4~7章依次是满足另外四个目标的。下面对各部分的重点内容分别略作介绍。
一、介绍一个调试高手应该掌握的CPU层的基础知识。第2章和第3章是专门服务于这一目的的。调试好比行医看病,病人是计算机系统,要能看懂这个系统的毛病然后再对其施以治疗或者手术,那么必须了解其五丈六腑的结构,血脉流通的路线,生息运转的机理。要做到这一点,深刻理解计算机系统中硬件部分的核心——CPU——很重要。有人说,CPU是重要,但有什么必要在一本《软件调试》的书中写这个呢?调试高手还需要数学基础和语文基础呢,怎么不开两章讲讲呢?这一拮问不是没有道理,因此作者考虑到这一点,慎重选择了要讲的内容,并严格控制了篇幅。入选的内容要符合三个条件:一是够重要,二是够常用,三是与调试密切相关。于是,《软件调试》最后选择如下一些内容:
更多...
在从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
更多...
WinPE是Windows Preinstallation Environment 的简称,简单理解就是不需安装就可以使用,可以直接在只读介质上启动的Windows。比如,Vista的安装光盘上就包含了一个WinPE,系统修复功能就是工作在WinPE环境中的。
从软件实现的角度来看,WinPE与普通的Windows是共享主要源代码的,但是有些逻辑是专门针对WinPE的,这可以通过编译选项来控制这种差异。
因为内核的主要代码都是相同的,所以WinPE也有内核调试支持。当在BOOTMGR阶段按F8选择Debug
更多...
这两天使用Virtual PC(2004)安装了Windows XP SP3的Check版本。有些要点值得分享和备忘。 1 安装过程中的蓝屏 在安装程序复制好文件,重新启动时,会出现蓝屏,蓝屏代码是未处理的内核态异常,异常代码是80000003,即断点异常。看到这个蓝屏后,我想到是Check版本中的某些ASSERT所导致的,保留了更多的断言是Check版本的最大特色。对于断言,如果有调试器,那么系统就会中断到调试器,然后继续也可以了。 但是此时还不能进入系统启用调试选项,怎么办呢?于是想到了按F5在高级启动选项中选择调试选项。关于这个默认调试选项采用的连接参数,一种说法是COM1,一种说法是可以枚举到的最大编号COM口。实验下来,是第二种。也就是当调试器中使用COM2时,成功与虚拟机中的KD建立了连接。这验证了《软件调试》所采信的说法(18.3.3,P478)对于XP
更多...
这几天大家都忙着看奥运,我也不例外。周六上午从头到尾观看了女子48公斤级举重比赛。今天又看了男子56公斤级举重比赛的后半截。两场比赛看下来,一个很深的感受是,两位冠军赢得都是非常的“轻松”。首先是甩开第二名的差距很大,都是在比赛还没有进行完的时候就稳操胜券了。另外,两个人在比赛时都神情自若,有闲庭信步的轻松自如劲。
在女子48公斤级的比赛中,很多选手在抓举重量过了80公斤后便开始力不从心了,纷纷失败,特别出人意料的是,上届冠军土耳其选手塔伊兰在82公斤和84公斤两个重量上三次试举都以失败结束,失去分数,无缘继续比赛。这时,陈燮霞还没有出场,因为她要的开把重量就是92公斤。在杠铃重量升高到90公斤时,陈燮霞出场了,可能是教练看到场上的形势变化后,也开始追求稳妥。这时,很多人(包括看电视的我)也都为陈燮霞捏把汗,要是举不起来就完了(:-))。但是陈燮霞很快就让这种担心变成多余,她非常轻松的举起了接近她体重两倍的杠铃。随后她又举起了93公斤和95公斤两个重量,以完美的表现结束了抓举比赛。在之后的挺举比赛中,陈燮霞依然赢得非常轻松,先是轻松的举起了锁定胜局的103公斤,而后又有惊无险的举起了105公斤和117公斤,夺得了冠军的同时,也改写这个项目的奥运会纪录。
更多...
除了串行口、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传递数据。
更多...
拙作《软件调试》出版两个月了,有热心读者建议我讲些阅读这本书的方法。有读者愿意读自己的书,当然是好事,再说读者是客户,他们的意见就是命令,不能怠慢。粗略思考一番,计划先为《软件调试》的每一篇写一个导读短文。总为开篇,今日先谈谈《软件调试》这本书的篇章结构,用软件的术语就是架构,用写作的术语也就是提纲。
从最初的书名说起
早在2003年,我就萌生了写一本关于软件调试的书的念头。但是软件调试是个大话题,有很多东西可以写,必须选择好一个角度才能写出一本好书来。于是我开始搜索当时已经有的书,无论是美国出的,还是英国出的,一共找到了十来本。而后,逐一了解了已有的这些书,归纳了它们的主要内容和特色。
更多...
在Vista之前,NTLDR是Windows操作系统的加载程序,它负责将CPU从实模式切换为保护模式,加载内核文件和启动类型的驱动程序,然后把执行权交给内核文件的入口函数,即KiSystemStartup。
从要完成的任务角度来看,NTLDR内部又分为两个部分,一部分负责接受执行权,做模式切换,硬件检查,即启动的准备工作,这部分通常称为boot;另一部分负责加载内核文件,并为内核的运行做必要的准备,通常称为OsLoader。
Vista将以上两个部分分成两个独立的程序文件,即BootMgr和WinLoad.exe。下图描述了BootMgr和WinLoad的相互关系和它们在启动过程中的作用。
更多...
我是在2007年11月听说Advanced Windows Debugging(姑且翻译为《Windows高级调试》,简称AWD)这本书的。一个朋友和我说有一本书和你在写的书很相似,已经要出版了。朋友这样说当然是好意,防止我白费功夫重复劳动。或者用英文说就是不要“Reinvent the wheel(重复发明轮子:-))”,其实中文也有很多类似的冷语,比如“吃人家嚼过的馍”,其讽刺度之深比重新发明轮子还恨。我初听这个消息当然为之一振,可不想自己写了两年多(当时已经两年多)的东西与别人的一样。当晚我便GOOGLE了这(AWD)本书,当时在AMAZON上便有该书的预报,有章节目录。把章节目录看了两三遍后,我的担心慢慢散去了。从目录框架显然可以看出,AWD与我的《软件调试》大不一样。于是这个小“震动”只影响了我几个小时后,我便继续投入到《软件调试》的工作了,当时《软件调试》的第一稿也已经完成,在编辑和审阅第二稿的过程中。
更多...
《软件调试》于上周进入工厂印刷,第一本有望在本周装订完成。第一本审查无误后,那么第一批600册将在下周完成!
同时,《软件调试》的主页也初步建成,网址为http://advdbg.org/books/swdbg/。欢迎大家访问和提宝贵意见!
更多...
好消息,今天一早看到了Gregg的来信,他兴奋的告诉我机械工业出版社(华章)已经购买了Showstopper中文版的版权,双方正式签约。因此,这本英文名著的中文版本应该在今年年内就能与大家见面了。:-)
接下来应该是比较艰辛的翻译工作。这本书首先是一本好的报告文学,作者笔触灵动,妙语连珠,因此最好有一位文科的人来翻译。但同时,这本书又涉及到较深的技术和对软件工程的深刻思考,所以翻译的人还是要懂计算机。
书名也体现了这一点!不论是主标题和副标题都不那么容易翻译!:-)欢迎大家来试一试呀!
主标题:
更多...
2008年的第一天,阳光灿烂!对于上海这个多阴多雨的城市,这冬日的阳光着实是为新的一年送了一份厚礼!
每个人对新的一年都会有很多期待,北京奥运会无疑是最有共性的一个。于我,《软件调试》的出版是第一号的期待。一些热心的朋友也在期待这本书,他们的期待是我的动力。
以下是《软件调试》一书的主要内容,全书共30章,分为六篇。
第一部分:绪论(第1章)作为全书的开篇,这一部分介绍了软件调试的概念、基本过程、分类、和简要历史,并浏览了本书后面将详细介绍的主要调试技术。
第二部分:CPU的调试支持(2~7章)CPU是计算机系统的硬件核心。这一部分以IA-32
更多...
OSR新闻组中有人询问如何知道一个DUMP文件对应的目标系统中有几个CPU。其实这有很多方法,聊举数例(:-))。
1)首先如果使用WinDBG打开DUMP文件,那么从WinDBG输出的概要信息中就可以判断出CPU的个数。举例来说,以下是打开一个来自双核CPU系统(Vista)的DUMP文件时WinDBG所显示的信息:
Windows Vista Kernel Version 6000 MP (2 procs) Free x86 compatibleProduct: WinNt, suite:
更多...
泰克(http://www.tek.com/)是全球著名的测试测量仪器生产厂商,它的最著名产品是示波器。从调试的角度来看,示波器对于硬件工程师来说就好像是软件工程师使用的调试器。
在硬件领域,已经形成了一个不算太小的产业来专门生产以示波器、逻辑分析仪为代表的测试和调试设备,人们愿意以高昂的价格来购买这些设备,厂商们也不断的加大投入来研发更好、更先进、价格也更昂贵的设备。
与硬件领域相比,软件领域中人们对调试的重视真是天壤之别。著名的SoftICE在去年宣布停止开发了(看高手们对此是多么伤心http://blogs.msdn.com/matt_pietrek/archive/2006/04/07/570927.aspx)。Syser的开发还在维持,但是开发者最大的顾虑不是技术难度,而是客户太少。
更多...
IA-32 CPU从P6开始便支持分支监视和记录机制。说白了这种机制就是记录下CPU曾经执行的分支。把这些分支信息串联起来便可以得到CPU的执行轨迹。这一机制的名称被称为BTS,Branch Tracing Store,它与Debug Store,简称DS有着紧密关系。
以下是使用BTS机制所编写的一个示例程序CpuWhere的工作画面。
窗口左侧是一系列控制按钮,编辑框用来指定BTS缓冲区可以容纳的BTS记录数,也就是SetupDSArea函数的参数。窗口右侧的列表框用来显示从驱动程序读取到的BTS记录。显示的顺序与栈回溯类似,最近发生的在上方。或者说,CPU的运行轨迹是从下到上。
更多...
WinDBG是个调试器,但其本身也是个软件,也有BUG,这就好像医生也会生病一样。如何调试WinDBG呢?WinDBG的设计者们早考虑到了。比如.dbgdbg命令就是启动一个调试器来调试当前的调试器。
再如,使用.outmask命令可以让WinDBG输出自己的调试信息。参数可以是下表中的各个标志位的组合。
Value
Default setting
Description
1
On
Normal output
2
On
Error output
更多...
不论是Windows XP/2000,还是刚兴起的 Windows Vista,它们都是基于经典的Windows NT内核。 NT内核从1988年[此处曾经误写为1998年,感谢chinaclastar留言指出]开始开发,历时将近5 年与1993年7月26 日发布,即NT 3.1。
在开发NT内核的近 5年中,有很多精彩的故事,和发人深省的东西,这些东西既有软件工程方面的、技术方面的,也有团队协作、和最基本的人性方面的。
幸运的是,有一本书很好的记录了开发NT内核的人和事,这本书的名字叫 《Showstopper》。
更多...
昨晚因为要访问wikipedia,但是因为它被国内禁了(真是想不通,这个为什么要禁???),于是想用个代理试一下。没有想到,不仅wikipedia没访问到,所有网站都上不了了。使用ping可以通,但是IE就是显示各种各样的连不上错误。
试了几种常用的方法,比如检查网络连接,代理设置等,都不行,我意识到中招了。
看了下系统内安装的几个安全软件(XX防病毒、XX防火墙、XXXX访攻击),它们都没有记录和报告任何异常,真是白养着它们,整天在那空耗CPU和磨损硬盘!!!
怎么办呢?忍着或者重装系统可不是我要干的。首先将windbg附加到IE进程,检查是否有“不速之客”。仔细看了一圈,没有发现(这需要对很多模块的文件名很熟悉呀!要知道IE进程里有几十个各种各样的模块呀)。
更多...
1,Mike Stall's .NET Debugging Blog http://blogs.msdn.com/ntdebugging/
2,使用WinDbg调试.Net http://blogs.msdn.com/tess/default.aspx
3,Microsoft Critical Problem Resolution (CPR)团队,Microsoft Advanced Windows Debugging and Troubleshooting http://blogs.msdn.com/ntdebugging/
更多...
使用SetupAPI安装驱动程序时,如果出现问题,往往比较难以调试。MSDN介绍了如何让SetupAPI输出更多信息到记录文件,和如何理解记录文件的信息。
Setting SetupAPI Logging Levels
[This is preliminary documentation and subject to change.]
You can control the amount of information that is written to the SetupAPI log,
更多...
Don Burn: ...the checked build of Windows when they pry it from my cold dead workstation.
This artical is abstracted from?WHDC website by Don.
The checked build of Windows is the Rodney Dangerfield of Redmond, "It don't get no respect," even from many
更多...
大家一定听说过刷系统BIOS、刷网卡(上面的firmware)、刷显卡。其实CPU也是支持并可以刷新升级的。
随着CPU复杂度的不断提高,以及一些复杂指令(如多媒体和浮点运算)的引入,测试CPU的复杂度也在成倍提高。再加上集成芯片的生产特征使得可以通过软件刷新产品化的CPU成为必要。
刷新的具体过程和刷其它firmware很相似,通常是由BIOS程序在POST的早期阶段通过CPUID指令把新的数据(2048字节)更新到CPU内部的可擦写ROM上。
不过也有工具可以在操作系统启动后来更新(http://www.urbanmyth.org/microcode/)
更多...
Windows XP附带了一个很好的小工具driverquery,使用它可以很轻松的查询出本机或远程系统中的驱动信息。尤其是给系统管理员和驱动程序开发人员带来了很大方便。
Driverquery是个控制台程序,位于Windows系统的system32目录下(大小50多K),因此你可以在任何控制台窗口运行它。
不带任何参数,便可以列出目前系统中已经加载的所有驱动,是按名字列出的。
Module Name Display Name
更多...
我想通过上面这个标题,记下调试中的一些趣事或有意义的细节。因为时间关系,这些小文章可能很简短,只是个简单的记录还来不及寻求更多深层的原因。
Detach Kernel Debugger
因为我经常是用我的笔记本电脑(Debugger)来调试另一台机器(Debugge). 所以每天下班时,如果调试还没有结束. 我就只好把Debugger detach下来, 第二天再继续. 有两种方法可以把WinDbg和被调试的机器分离开.
一种方法是让Debuggee在那里"死等"一夜. 具体做法是通过WinDbg的Debug菜单上的Detach
更多...
When we debug kernel drivers through a 1394 or COM cable using windbg, we can use .kdfiles command to transfer new driver build to the debuggee machine from the debugger machine or a share foler at any place accessable. The steps are as below.
1, Create
更多...
Issue:
In the ATL projects generted by VS2002, there is a Proxy/Stub project which is used for RPC(Remote Procedure Call). When you open such project in VS2003, you will get a fatal error asserted by compiler like below.
#if !(TARGET_IS_NT50_OR_LATER)
更多...
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
更多...
1: kd> kvChildEBP RetAddr Args to Child eed9dbe4 f76089d6 853ad660 864c2ed8 00000000 usbhub!USBH_IoctlGetNodeConnectionInformation (FPO: [Non-Fpo])eed9dc0c f7608a60
更多...
0: kd> !analyze -v********************************************************************************
更多...
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
更多...
使用WinDbg进行Windows内核调试通常需要两台计算机,一台是Debuggee,一台作为Debugger,又成为Host。使用Virtual PC可以在同一台电脑上进行内核调试,对于某些调试任务来说还是非常有用的。
下面以Virtual PC 2004为例,介绍一下利用Virtual PC进行Windows内核调试的详细过程。
1,下载并安装Virtual PC 2004,从略。
2,启动Virutal PC Console(控制台),创建一台新的虚拟PC,安装向导的提示配置硬盘、内存等参数。
更多...
至少两年前就听说Windows将支持通过USB 2.0接口进行内核调试。Vista推出后从它的配置文件中终于看到了配置USB的选项,安转WinDbg6.6后,在建立内核调试的对话框中也可以看到USB的TAB了。
但是帮助文档中却没有详细的说明介绍如何具体操作。于是很多人开始询问:
Yeah yeah yeah ... we've heard THAT before ... :)
Gary G. Little
-----Original Message-----From: bounce-247538-27300@lists.osr.com[mailto:bounce-247538-27300@lists.osr.com]
更多...
大家知道,DDK公开了两个内核API用于产生BSOD,分别是KeBugCheck()和KeBugCheckEx()。其原型分别如下:
VOID KeBugCheck(IN ULONG BugCheckCode );
VOID KeBugCheckEx(IN ULONG BugCheckCode, IN ULONG_PTR BugCheckParameter1,
更多...
近一两年来,WinDbg的版本更新差不多每月都有,这种速度也侧面证明了微软内部对WinDbg的重视,否则不会升级这么快吧?而且可以看出其发展是和微软的其它技术发展同步的。比如DotNet热时WinDbg的那几个版本加了很多对调试托管代码的支持,64位热时,WinDbg便加入对WOW64的支持。无疑微软的很多内部团队也在使用WinDbg做调试。当他们发现问题或有新的要求时就会让WinDbg改正或加入。
版本升级这么快,有时真的不知道每个版本到底有什么变化,该不该升级?还好微软的站点上有一个简单的列表关于每个版本的变化。但这个LISt已经不包括6.2以前的版本(大约是05年3月)了。说不定现在包括的版本过几个月也不见了。赶紧贴过来吧!
更多...
对于从事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
更多...
为了测试一个与系统电源有关的问题,我写了一个小程序(MFC)使用了如下API:BOOLEAN GetPwrCapabilities(
PSYSTEM_POWER_CAPABILITIES lpSystemPowerCapabilities
);MSDN对该函数的文档中有如下提示:
RequirementsClient: Included in Windows XP, Windows 2000 Professional, Windows Me, and Windows 98.Server:
更多...
HOST文件是本机上的一个域名与IP映射表,在DNS客户端与远程的DNS服务器进行域名前会先查阅这个文件。如果查找到了结果,那么就不去DNS服务器查了。因此HOSTS文件具有更高的优先级,这恰恰我们调试创造了一个极好条件。
比如我们在希望在本机跟踪网络服务或网页代码。通常我们用
http://localhost/advdbg/default.aspx
这样的链接来启动调试过程。
但是有时,调试一些与域名有关的问题,我们希望用正式的域名也可以进行跟踪。这时便可以使用HOSTS文件将本来要发动远程服务器的请求定向到本地来。方法就是在HOSTS文件中加入相应的重定向,如下例所示:
更多...
ACPI是现代计算机系统中BIOS与操作系统间的桥梁。ACPI不仅定义了很多电源和休眠有关的标准,它还定义了如何通过FADT、XSDT、RSDT以及ASL语言来实现与操作系统的交互。
有些系统问题,比如无法进入睡眠状态,无法唤醒(自动重启,或死机)等,是与ACPI直接有关的。但如何定位出错的具体原因一直是一个比较困难的课题。很多时候不得不使用排除及试探等间接方法来解决,效率很低。本文介绍一种直接跟踪ASL源代码的直接方法。
1, 将被调试机器上的ACPI.SYS换成Checked
更多...