|
Debug War
Debug War in Real World
这几天大家都忙着看奥运,我也不例外。周六上午从头到尾观看了女子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内核从1998年开始开发,历时将近5 年与1993年7月26 日发布,即NT 3.1。
在开发NT内核的近 5年中,有很多精彩的故事,和发人深省的东西,这些东西既有软件工程方面的、技术方面的,也有团队协作、和最基本的人性方面的。
幸运的是,有一本书很好的记录了开发NT内核的人和事,这本书的名字叫 《Showstopper》。
http://www.amazon.com/Show-Stopper-Cloth-BREAKNECK-GENERATION/dp/0029356717 更多...
昨晚因为要访问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 更多...
|