奇妙的系统性能问题(2)

引用注明>> 【作者:张佩】【原文:www.YiiYee.cn/blog

这篇文件是对上一篇《奇妙的系统性能问题》的补充。我在经历那次性能陡降问题困扰的过程中,还碰到了一次BSOD。当蓝屏发生的时候,我甚至是兴奋的。因为在此之前,我一直都认为问题是系统或软件模块导致的。而蓝屏正好是分析的切入点。所以当分析了这个dump后,我立刻扭转了方向,判断认为:确实是磁盘坏了。

这个结论是正确的,但却不完备的。因为最后的结果是磁盘并没有坏,而是受到了外部环境的干扰。

这个dump文件弥足珍贵,因为正常情况下,这种伤硬盘的实验我们是不会主动去做的。所以这个dump文件完全得于碰巧,在此进行分析。 继续阅读“奇妙的系统性能问题(2)”

5,485 total views, 4 views today

奇妙的系统性能问题

引用注明>> 【作者:张佩】【原文:www.YiiYee.cn/blog

在前一家公司时,我借了一台测试板用于开发和测试。这块板子在正常运行了一段时间后,忽然遇到持续性的系统性能问题。问题来得非常突然,是某一天早晨上班的时候突然发生的。像电影里面马师爷抱怨的那样,吃着火锅还唱着歌,就突然遇到劫道的了。都太突然了。

问题的特征非常明显,就是系统性能无限下降。登录到系统登录界面,往往要十几分钟。Win 8.1的Metro UI出来,又要若干分钟时间。所以常态下看到的界面,就是Metro UI上面一个个磁贴只有边框,图标内容则完全没画出来。 继续阅读“奇妙的系统性能问题”

4,488 total views, 7 views today

VS2012开发驱动小Tip之:更改KMDF版本以支持XP系统

我的印象中,我最早使用的KMDF版本是1.5,那是Vista出来的时候,时间大概2006年左右。KMDF的版本变更并不是很快,总是伴随着WDK的发布而更新的,而WDK版本的更新,一般又是和OS同步的。KMDF的主版本还是1,但次版本号总是以2递增:1.5(Vista)、1.7(Vista SP1)、1.9(Win7)、1.11(Win8)、1.13(Win8.1)

早期的KMDF版本保持了良好的向后兼容性,比如用最晚KMDF 1.9编译出来的驱动程序,可安装使用于XP系统*。但从下图(MSDN)可以看出,从KMDF 1.11开始,情况变化了。KMDF 1.11取消了对Vista以前系统的支持。而KMDF 1.13更绝,编译出来的驱动只能安装在Win8.1上。 继续阅读“VS2012开发驱动小Tip之:更改KMDF版本以支持XP系统”

12,345 total views, 22 views today

虫趣:当NV显卡驱动碰上Verifier

引用注明>> 【作者:张佩】【原文:www.YiiYee.cn/blog

今天开电脑的时候,刚完成用户登陆,就遇到一个蓝屏。桌面还没有进去呢。趁着系统正处于抓取dump文件的过程中,赶紧拍了一张照,留作纪念。造成蓝屏的不是别人,乃是负责图形渲染和显示的显卡驱动:Nvidia显卡驱动。

我使用的系统:Win Blue x64。

0xc4

继续阅读“虫趣:当NV显卡驱动碰上Verifier”

5,730 total views, 5 views today

工具:IOCTL助手 V1.1

IOCTL

我在10年写《竹林》这本书时,写了一个分析IOCTL值的工具,一直想着可以把界面再改善一下,功能更完善一点。今天正好有一点时间,就做了这件事情。用户可以使用这个工具查看、定义IOCTL值。

下载:[download id=”7″]

继续阅读“工具:IOCTL助手 V1.1”

5,796 total views, 5 views today

VS2012趣事:时区和时间戳

引用注明>> 【作者:张佩】【原文:www.yiiyee.cn/blog

前几天某个早晨,大概5点钟我就醒在床上,怎么也睡不着。想到手头还有一个驱动需要debug,就立刻发现了人生目标一样地爬了起来。匆匆洗漱完毕后,打开电脑,打开VS2012驱动项目。先把代码逻辑仔细的看过一遍,有了一点小发现,改了几行代码。按下F7开始编译。

编译结束后,很惊讶地发现“输出”试图中报了一个错误,是driver package工程报错。这里要说一下相关的背景,通过VS2012的工程向导创建的驱动项目(solution)总是包含两个工程(project):一个是驱动工程,所有的源代码都在此,编译后生成驱动文件(一般是.sys文件);一个是driver package工程,无源码,它的编译过程乃针对inf文件和sys文件进行处理,产生一个可安装的驱动包(driver package)。

头一次遇到package工程失败的情况,会是什么原因呢? 继续阅读“VS2012趣事:时区和时间戳”

462,873 total views, 291 views today

WDM驱动针对Win8前后系统的兼容性问题

引用注明>> 【作者:张佩】【原文:www.yiiyee.cn/blog

最近我写了一个WDM驱动的demo工程,选择target OS是Win8,在VS2012上编译通过后,安装在Win8系统上能正常运行。换了一台Win7系统,安装驱动的过程中即遇到蓝屏。后来发现问题不在安装上,蓝屏乃发生在驱动加载的时候。

因为驱动特别简单,我先排除代码出错的可能。为了比较,我接下来又创建了一个KMDF框架的驱动demo工程,测试过程如法炮制,却没有碰到任何问题

我立刻想到的是,WDK 8.0对WDM框架可能做了兼容性方面的修改。到底怎么回事呢?一起来看看吧。

继续阅读“WDM驱动针对Win8前后系统的兼容性问题”

9,805 total views, 4 views today

Large Pool 错误

引用注明>> 【作者:张佩】【原文:www.yiiyee.cn/blog

我前几个月曾经分析了一个BAD_POOL_CALLER的问题(链接),今天收到的这个dump文件,系统是Win7 X64,最后发现问题和前者非常相似,但二者的分析过程却截然不同。

引子

打开dump文件后,首先进行自动分析。蓝屏号是0x4E。

************************************************************
*                                                          *
*                        Bugcheck Analysis                 *
*                                                          *
************************************************************

PFN_LIST_CORRUPT (4e)
Typically caused by drivers passing bad memory descriptor lists (ie: calling
MmUnlockPages twice with the same list, etc).  If a kernel debugger is
available get the stack trace.
Arguments:
Arg1: 000000000000009a, 
Arg2: 000000000014e26c
Arg3: 0000000000000006
Arg4: 0000000000000002
 继续阅读“Large Pool 错误”

8,762 total views, 8 views today

虫趣:抓一个Intel显卡驱动的臭虫

引用注明>> 【作者:张佩】【原文:www.yiiyee.cn/blog

同事给我发过来一个dump文件,说是在做S4压力测试的时候挂掉的。蓝屏号0x9F。因为前几天刚好解决了一个0x9F的蓝屏,怀疑是不是类似问题?拿过来一分析,风牛马不相及。可见同样是简称LYF,有可能是指刘亦菲,也有可能是罗玉凤。同样是0x9F的蓝屏,有可能5分钟定位错误,也有可能半天都找不到问题所在。 继续阅读“虫趣:抓一个Intel显卡驱动的臭虫”

16,986 total views, 8 views today

虫趣:FAST_MUTEX死锁

拿到一个dump文件后,经过简单分析,是设备驱动在处理电源IRP时,超时未完成导致的。这是一个典型的0x9F BSOD错误:

DRIVER_POWER_STATE_FAILURE (9f)
A driver has failed to complete a power IRP within a specific time (usually 10 minutes).
Arguments:
Arg1: 0000000000000003, A device object has been blocking an Irp for too long a time
Arg2: fffffa800182aa90, Physical Device Object of the stack
Arg3: fffff800139e9930, nt!TRIAGE_9F_POWER on Win7, otherwise the Functional Device Object of the stack
Arg4: fffffa8002437e10, The blocked IRP

继续阅读“虫趣:FAST_MUTEX死锁”

6,528 total views, 3 views today

几首诗

开心网是前年的事了,我曾经通过它的日记功能,发表过一些文章。此后,两三年里面,再没有上去过。今天忽然想起一件事,记得在日记里的,便又登陆上去看,庆幸用户名和密码都记得。记忆简直断片了,原来我在上面写过三十几篇日记呢。

我从上小学开始,喜欢古诗。偶尔还写一些。我写的东西,不能用好、坏论。就好比学生要学造句,我不过用文言文造句罢了。这样的造句,我持续了近二十年。家里曾有最早的一本11岁时候的结集,存了十几首。

这样的造句,最近也已不能够了。但三年前,还是可以的。开心网很少再去了,把那几首诗,记在这里(有几首和编程有关)。 继续阅读“几首诗”

2,291 total views, 4 views today

Windows系统时钟间隔

引用注明>> 【作者:张佩】【原文:www.yiiyee.cn/blog

下载:[download id=”5″]

系统时钟间隔是个很少被关心到的系统标量,它反映了系统产生时钟中断的频率,间隔越小频率越高,反之亦然。每当时钟中断产生,系统相关的中断函数将会处理这个中断。时钟中断处理函数会更新系统时间,检查内核调试信息等。

1. 时钟间隔

系统时钟间隔和另一个极重要的系统标量关联在一起:线程调度时限。按照Windows系统的设计,线程调度时限被分为普通程序后台服务两种类型。前者运行2个时钟间隔,后者运行12个时钟间隔,用户可以在系统属性中手动更改时限类型。

不同硬件平台定义有不同的最小、最大时钟间隔值。对于X86平台而言,最小时钟间隔是0.5ms,最大值大概是15.6001ms。在内部,时钟间隔以100ns为单位进行表述,所以0.5ms被表示为5000个100ns单位,15.6ms被表示为156001个100ns单位。 继续阅读“Windows系统时钟间隔”

13,601 total views, 8 views today

如何在Visual Studio项目中正确添加汇编代码

引用注明>> 【作者:张佩】【原文:www.yiiyee.cn/blog

1.      问题描述

在以往的编程经历中,本人最常使用的汇编代码是__asm {int 3}。它可以在我的代码中插入一个软件断点。如果没有一个连接到当前程序的调试器,则程序将停止在这行语句处无法继续执行。

上面的这种方式称为高级语言和汇编语言混编。当我用得正爽的时候,迎头碰到了64位平台这员猛将。它大手一张,挑出一张禁令通知单:在64位编程中,高级语言和汇编混编将再也不被支持!兄弟我不禁暗暗垂泪,因为当我固执而行的时候,若干恶心的编译错误赫然出现在我的面前: 继续阅读“如何在Visual Studio项目中正确添加汇编代码”

15,138 total views, 17 views today

Windbg调试命令详解

转载注明>> 作者:张佩】【原文http://www.yiiyee.cn/Blog

1. 概述

用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是:cdb.exe、ntsd.exe、kd.exe和Windbg.exe。其中cdb.exe和ntsd.exe只能调试用户程序,Kd.exe主要用于内核调试,有时候也用于用户态调试,上述三者的一个共同特点是,都只有控制台界面,以命令行形式工作。

Windbg.exe在用户态、内核态下都能够发挥调试功能,尤其重要的是,它不再是命令行格式而是采用了可视化的用户界面。所以绝大部分情况下,我们在谈及Windows调试工具的时候,都直接指向Windbg,而不大谈及前三者。

Windbg在用户态和内核态下,都支持两种调试模式,即“实时调试模式(Living)”和“事后调试模式(Postmortem)”。所谓实时模式,是被调试的目标对象(Target)当前正在运行当中,调试器可以实时分析、修改被调试目标的状态,如寄存器、内存、变量,调试exe可执行程序或双击双机实时调试都属于这种模式;所谓事后模式,是被调试的目标对象(Target)已经结束了,现在只是事后对它保留的快照进行分析,这个快照称为转储文件(Dump文件)。 继续阅读“Windbg调试命令详解”

45,736 total views, 31 views today

Windbg中查看计算机名

转载注明>> 【作者:张佩】【原文:http://www.yiiyee.cn/Blog

 引子

 使用Windbg调试目标对象的时候,用户发现到它的一个缺陷,就是不能自动识别目标设备的机器名。实际上Windbg总是标出了Machine Name的关键字,但却从来都没有显示。可以认为Windbg在这个地方有点小缺陷。见下面的例子:
0:000> vertarget
Windows 7 Version 7601 (Service Pack 1) MP (8 procs) Free x64
Product: WinNt, suite: SingleUserTS
kernel32.dll version: 6.1.7601.18015 (win7sp1_gdr.121129-1432)
Machine Name:
Debug session time: Thu Aug 22 10:11:04.000 2013 (UTC + 8:00)
System Uptime: 14 days 17:26:44.613
Process Uptime: 14 days 17:14:25.000
  Kernel time: 0 days 0:09:02.000
  User time: 0 days 0:42:36.000

继续阅读“Windbg中查看计算机名”

7,555 total views, 4 views today