软件调试
文章平均质量分 88
张佩
十年Windows内核程序员调试员著有竹林蹊径深入浅出Windows内核开发
展开
-
VirtualKD + VMWare实现单机内核调试
VirtualKD + VMWare实现单机内核调试 By 张佩 若干年以前,我的前同事酒若v霖(JIURL)写的《借助VMware实现单机使用Wi原创 2010-11-16 12:50:00 · 15558 阅读 · 10 评论 -
虫趣:FAST_MUTEX死锁
问题到此可告一段落了:线程1在处理IRP_MJ_POWER的时候,试图获取一个FAST_MUTEX同步对象,但因获取失败而进入休眠状态(并因休眠过久,而导致BSOD)。在成功获取FAST_MUTEX对象的地址后,从它的结构体中得到了当前拥有此同步对象的线程2地址。切换到线程2,发现线程2有一个无法处理的页错误,也同样处于等待状态中。原创 2013-10-30 15:03:13 · 4967 阅读 · 1 评论 -
虫趣:抓一个Intel显卡驱动的臭虫
同事给我发过来一个dump文件,说是在做S4压力测试的时候挂掉的。蓝屏号0x9F。因为前几天刚好解决了一个0x9F的蓝屏,怀疑是不是类似问题?拿过来一分析,风牛马不相及。可见同样是简称LYF,对应的可能是刘亦菲,也可能是罗玉凤。原创 2013-11-05 17:21:06 · 8027 阅读 · 2 评论 -
程序员遇到Bug的30种反应
英文原文:HONGKIAT 中文翻译:CSDN开发应用程序是件压力很大的事情,尤其是当编写完代码后,突然冒出个Bug,这真是让人百感交集、痛不欲生。那么,如何平心静气地解决每一个Bug,是每个程序员都要修炼的地方。下面本文将分享程序员遇到Bug时,最常说的30句话,不知道你中枪了没?1.我不知道该删掉还是重写。2.在开始项目之前,我应该先在Github上找找有没有合适的框架3.为什么这个脚本会需转载 2013-11-07 13:44:20 · 3495 阅读 · 0 评论 -
张佩的Dump服务
如果你有一个Dump文件——不管是应用程序还是内核驱动——但不知道从何下手,看不到任何希望,没有半点头绪。还等什么?赶快使用我提供的这项服务吧!1. 传送Dump文件。将Dump文件和必要的符号文件压缩后,通过网盘、GMAIL邮箱或QQ中转站等方式,发送给我(专用mail: zhang.xiaopei@live.com)。2. 分析时间。一般需3-5天左右缓冲时间。如要加急,请事先和我沟通。3. 分析结果。一般来说,我拥有在技术文章中引用dump文件分析过程的权利,但引用时会将模块名、函数进行模糊处理原创 2013-07-16 13:41:57 · 2897 阅读 · 0 评论 -
奇妙的系统性能问题(2)
这篇文件是对上一篇《奇妙的系统性能问题》的补充。我在经历那次性能陡降问题困扰的过程中,还碰到了一次BSOD。当蓝屏发生的时候,我甚至是兴奋的。因为在此之前,我一直都认为问题是系统或软件模块导致的。而蓝屏正好是分析的切入点。所以当分析了这个dump后,我立刻扭转了方向,判断认为:确实是磁盘坏了。这个结论是正确的,但却不完备的。因为最后的结果是磁盘并没有坏,而是受到了外部环境的干扰。这个dump文件弥足珍贵,因为正常情况下,这种伤硬盘的实验我们是不会主动去做的。所以这个dump文件完全得于碰巧,在此进行原创 2014-04-13 16:48:53 · 4160 阅读 · 1 评论 -
Large Pool 错误
引用注明>> 【作者:张佩】【原文:www.yiiyee.cn/blog】我前几个月曾经分析了一个BAD_POOL_CALLER的问题(链接),今天收到的这个dump文件,系统是Win7 X64,最后发现问题和前者非常相似,但二者的分析过程却截然不同。引子打开dump文件后,首先进行自动分析。蓝屏号是0x4E。********************************************原创 2013-12-27 15:41:33 · 4057 阅读 · 0 评论 -
虫趣:当NV显卡驱动碰上Verifier
今天开电脑的时候,刚完成用户登陆,就遇到一个蓝屏。桌面还没有进去呢。趁着系统正处于抓取dump文件的过程中,赶紧拍了一张照,留作纪念。造成蓝屏的不是别人,乃是负责图形渲染和显示的显卡驱动:Nvidia显卡驱动。原创 2014-04-08 21:13:29 · 6798 阅读 · 3 评论 -
奇妙的系统性能问题
在前一家公司时,我借了一台测试板用于开发和测试。这块板子在正常运行了一段时间后,忽然遇到持续性的系统性能问题。问题来得非常突然,是某一天早晨上班的时候突然发生的。像电影里面马师爷抱怨的那样,吃着火锅还唱着歌,就突然遇到劫道的了。都太突然了。问题的特征非常明显,就是系统性能无限下降。登录到系统登录界面,往往要十几分钟。Win 8.1的Metro UI出来,又要若干分钟时间。所以常态下看到的界面,就是Metro UI上面一个个磁贴只有边框,图标内容则完全没画出来。原创 2014-04-08 21:18:58 · 3583 阅读 · 2 评论 -
Win32K里的死循环
到新公司第一次debug,就发现了微软Windows Win32K模块的一个Bug。想知道怎么回事吗?请细细地看。原创 2014-05-20 13:50:05 · 4278 阅读 · 5 评论 -
Windbg调试命令详解(4)
5. 内存命令这一节里面,我们学习如何查看内存信息。内存是存储数据、代码的地方,通过内存查看命令可以分析很多问题。相关命令可以分为:内存查看命令和内存统计命令。内存统计命令用来分析内存的使用状况。5.1 查看内存 有非常丰富的内存查看命令,它们被统一为d*格式,如下所示:d[类型] [地址范围] d代表Display,类型包括:字符、字符串、双字等。具体来说,d*命令共有这几种:d、 da、db、dc、dd、dD、df、dp、dq、du、dw、原创 2013-10-12 14:15:02 · 5398 阅读 · 0 评论 -
Windbg调试命令详解(3)
3 进程与线程既可以显示进程和线程列表,又可以显示指定进程或线程的详细信息。调试命令可以提供比taskmgr更详尽的进程资料,在调试过程中不可或缺。3.1 进程命令进程命令包括这些内容:显示进程列表、进程环境块、设置进程环境。进程列表多个命令可显示进程列表,但一般只能在特定情况下使用,它们是:|、.tlist、!process和!dml_proc。竖线命令显示当前被调试进程列表的状态信息,这个命令在本章开头已作过介绍,命令格式如下:| [进程号]请注意这里的定语:被调试进程列原创 2013-10-08 16:03:21 · 6219 阅读 · 0 评论 -
Windbg调试命令详解(2)
符号与源码是调试过程中的重要因素,它们使得枯燥生硬的调试内容更容易地调试人员读懂。在可能的情况下,应该尽量地为模块加载符号和源码。大部分情况下源码难以得到,但符号却总能以符号文件的形式易于得到。什么是符号文件呢?编译器和链接器在创建二进制镜像文件(诸如exe、dll、sys)时,伴生的后缀名为.dbg、.sym或.pdb的包含镜像文件编译、链接过程中生成的符号信息的文件称为符号文件。具体来说,符号信息包括如下内容:全局变量(类型、名称、地址);局部变量(类型、名称、地址);函数(名称、原型、地址原创 2013-09-01 09:53:30 · 6257 阅读 · 1 评论 -
虫趣:BAD POOL CALLER (par1: 0x20)
【作者:张佩】 【原文:http://www.yiiyee.cn/Blog/0x19-1/】内核在管理内存的时候,为了提高内存使用效率,对于小片内存的申请(小于一个PAGE大小),都是通过内存池来操作的。系统里面有两种不同的内存池:分页内存池和非分页内存池。这二者的区别是很明显的:分页内存池所使用的内存页面,随时有可能被分页出去;而非分页内存池所使用的虚拟页面,总是留驻在物理内存中。原创 2013-07-21 12:10:24 · 4230 阅读 · 0 评论 -
虫趣:Win8系统Bug分析一例
【作者:张佩】【原文URL: http://www.yiiyee.cn/Blog/win80x7e/】有肉的地方总能发现蚊蝇。有软件的地方,就有臭虫相随(注1)。操作系统就是个大软件,所以臭虫是少不了的。最近碰到一个Windows 8的系统臭虫,报给微软并得到了确认,他们确保会在Windows Blue上解决此问题。到底是什么问题呢?今日有空,和大家一起来聊聊。发现问题原创 2013-05-23 19:50:42 · 3823 阅读 · 1 评论 -
初学Windbg,从主题布局开始
欢迎转载:【作者:张佩】【原文:http://www.yiiyee.cn/Blog/windbg-theme/】Windbg把和调试相关的所有配置称为workspace,这些配置信息包括:调试窗口类型和位置,打开的文件和窗口位置,符号、源码和可执行文件的路径。Windbg中包含多种不同类型的workspace:基本workspace。打开Windbg并且没有进行任何调试操作的情况下原创 2013-07-22 17:36:13 · 3946 阅读 · 1 评论 -
虫趣:除0引起的崩溃
【作者:张佩】【原文: http://www.yiiyee.cn/Blog/0x7f-1/】内核之所以脆弱,是因为它没有办法很好地隔离自己。它是一个大整体,属于一荣俱荣、一损俱损的大整体。它需要一切都按部就班地执行有序。否则,一个角落里的蝴蝶扇动翅膀,就能招来太平洋上的绝大风暴。现在看到的是一个内核中的除0错误。用户程序中的除零导致进程崩溃,内核中则系统崩溃。int AlwaysD原创 2013-07-21 12:07:24 · 2849 阅读 · 0 评论 -
BSOD分析之空指针引用
这是一个BSOD 0x3B的dump文件,BSOD 0x3B所代表错误的描述是:SYSTEM_SERVICE_EXCEPTION,表示在一个系统线程里面发生了不可解决的系统异常,导致的系统错误。系统线程是一个笼统的概念,凡是通过内核函数IoCreateSystemThread创建的线程,都是系统线程。内核是一个混沌的整体,内核里面不存在进程的概念。但是它却需要分配一些独立执行的任务,线程是原创 2013-08-08 16:46:33 · 4177 阅读 · 0 评论 -
别动系统的奶酪——违法Windows内核保护的错误(CRITICAL_STRUCTURE_CORRUPTION)
欢迎转载:【作者:张佩】【原文:http://www.yiiyee.cn/Blog/0x109-1/】引子下班的时候准备关掉调试机,却遇到蓝屏。本想直接拔电源,但蓝屏总是让我好奇,于是决定多待十分钟,看看这个蓝屏是怎么回事。主机的windbg调试器已经用DML标记出了自动分析命令!analyze –v。于是点进去:1: kd> !analyze -vERROR: Find原创 2013-08-01 12:20:06 · 10918 阅读 · 0 评论 -
虫趣:不同模块对同一变量类型的不同定义
欢迎转载 【作者:张佩】【镜像:http://www.yiiyee.cn/Blog/dll-1/】引子周末写了一个简单的程序(后文以Test.exe代指),通过Iphlpapi.dll提供的API函数GetAdaptersInfo,读取系统中的网卡信息,通过网卡名找到我想要的虚拟网卡后,将网卡信息结构体(IP_ADAPTER_INFO)保存到一个全局变量中。逻辑很简单,写完之后测试也没有发现问题。原创 2013-08-13 15:13:18 · 2561 阅读 · 0 评论 -
Windbg技巧: 利用C++类对象的虚拟函数表指针在内存中搜索对象
Windbg是Windows系统下的调试利器,但即便有了windbg,也有力不从心的时候。我最近对release版本的驱动程序调试得较多,最大的困扰是虽然有私有符号,但在切换堆栈帧的时候,大多数情况下无法定位局部变量,从而使得信息有效性极大降低。编译器对Release版本进行了多种优化,这一次影响到的局部变量优化。局部变量优化则有两种情况,第一种是局部变量A直接保存在寄存器中,而不在栈上申请空间;第二种是在栈上申请空间,但当变量A不再被使用时,新的局部变量B将覆盖A的位置,这样变量A的有效信息将消失。但有时原创 2011-11-27 15:01:57 · 4659 阅读 · 0 评论 -
Windbg中查看计算机名
使用Windbg调试目标对象的时候,用户发现到它的一个缺陷,就是不能自动识别目标设备的机器名。实际上Windbg总是标出了Machine Name的关键字,但却从来都没有显示。可以认为Windbg在这个地方有点小缺陷。见下面的例子://示例见原文在调试一些很困难问题的时候,比如目标系统boot失败、桌面不能正常显示、dump分析,这些情况下,我们没法通过登录到目标机器上去查看机器名,只能借助Windbg来实现。虽然Windbg没有自动显示功能,但仍然可以通过两种方法来实现手动实现。我们分两种情况来讲原创 2013-08-23 11:00:41 · 39550 阅读 · 2 评论 -
Windbg调试命令详解(1)
用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是:cdb.exe、ntsd.exe、kd.exe和Windbg.exe。其中cdb.exe和ntsd.exe只能调试用户程序,Kd.exe主要用于内核调试,有时候也用于用户态调试,上述三者的一个共同特点是,都只有控制台界面,以命令行形式工作。Windbg.exe在用户态、内核态下都能够发挥调试功能,尤其重要的是,它不再是命令行格式而是采用了可视化的用户界面。所以绝大部分情况下,我们在谈及Windows调试工具的时候,都原创 2013-09-01 09:47:18 · 6166 阅读 · 1 评论 -
多了一个“星号”
国庆假期我看WDK 8.1中的sample项目,遇一极有趣问题,和基本的指针使用有关,特缀文于此。请看下面是WDK8.1 msplot项目中的一段代码(经我简化过),三行而已,作一个减法运算。注释中的例值,其期望结果应是0x10,但意外得到一个溢出后的大值。原创 2014-10-21 10:20:05 · 5450 阅读 · 11 评论