网络内核调试的春天

今天试了两个虚拟机,virtualbox和vmware player,看能不能支持网络调试。结果非常满意,两个虚拟机软件默认配置的虚拟网卡,都能用于建立网络内核调试连接,我三下两除二地,就把内核调试给建立了。vmware中的网卡设备是82574L Gigabit NIC,设备ID是8086/10D3。VirtualBox中的网卡设备是Pro/1000 MT(即颇为经典的E1000系列),设备ID是8086/100E。检查Windows网络内核调试所支持的NIC列表,发现这两块网卡,都在被支持的列表中。链接:Supported NIC for network kernel debug。

不同的虚拟机软件配置其虚拟网卡的方式不尽相同,我比较喜欢VirtualBox,它直接提供了一个可选列表框让用户选择,默认是Pro/1000 MT。VMWare Player则没有类似的接口,但我查看了网上的一些资料,用户也可以通过直接修改配置文件的方式,配置虚拟网卡的类型。 继续阅读“网络内核调试的春天”

3,698 total views, no views today

多了一个“星号”

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

国庆假期我看WDK 8.1中的sample项目,遇一极有趣问题,和基本的指针使用有关,特缀文于此。请看下面是WDK8.1 msplot项目中的一段代码(经我简化过),三行而已,作一个减法运算。注释中的例值,其期望结果应是0x10,但意外得到一个溢出后的大值:

/* struct _PLOTGPC                      */
/* {                                    */
/*  //...                               */
/*  LPVOID pData;                       */ 
/* };                                   */

LPBYTE *pByte = pPlotGPC->pData; // pByte:0x0040fa30
pByte -= (ULONG_PTR)pPlotGPC;    // pPlotGPC:0x0040fa20
pPlotGPC->pData = pByte;         // 结果:0xff3d11b0

继续阅读“多了一个“星号””

5,292 total views, no views today

Win32K里的死循环

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

这是我到新公司后上手的第一个issue。一线工程师找到我,说有一个urgent issue有没有兴趣看一看。当时他已经组织了一个team的人帮助他,我便成了其中一员。

问题确实很紧急,已经影响了产线的生产。当时正临清明假期,导致很多人都岌岌可危地面临清明加班的可能。其实这个问题已经报出来好几个月,但一线工程师一直以绥靖政策对待,以各种方式把问题发生率降低到客户接受的水平。绥靖政策长时间以来是有效的,但最近却突然失效,发生率飙升到了20%。一线工程师才真的着急了。

问题定性

组一个team的人debug同一个问题,在我以前是未曾经历过的。初始的想法当然是认为人多力量大。但真正实施的时候,也可能遭遇人多嘴杂的窘况。 继续阅读“Win32K里的死循环”

7,628 total views, 1 views today

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

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

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

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

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

6,086 total views, no views today

奇妙的系统性能问题

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

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

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

5,133 total views, 1 views today

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

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

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

我使用的系统:Win Blue x64。

0xc4

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

6,396 total views, no views today

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

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

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

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

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

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

11,014 total views, no 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 错误”

10,046 total views, no views today

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

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

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

19,440 total views, 1 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死锁”

7,503 total views, 1 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调试命令详解”

50,163 total views, 3 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中查看计算机名”

8,146 total views, 1 views today

虫趣:不同模块对指定变量类型的定义不同

欢迎转载 作者:张佩】【原文http://www.yiiyee.cn/Blog/dll-1/

引子

周末写了一个简单的程序(后文以Test.exe代指),通过Iphlpapi.dll提供的API函数GetAdaptersInfo,读取系统中的网卡信息,通过网卡名找到我想要的虚拟网卡后,将网卡信息结构体(IP_ADAPTER_INFO)保存到一个全局变量中。

逻辑很简单,写完之后测试也没有发现问题。后来开启Application Verifier并运用到Test.exe,竟然每次运行都发生崩溃。仔细看去,问题出在保存结构体到全局变量的语句上。看到这个错误后,本想凭借猜测把问题解决掉,试了三五分钟后,竟不能够。最后还只能上调试器,错误原来是不同模块对同一个变量类型(time_t)有不同的定义(默认定义的长度为8字节;而Iphlpapi模块出于和Win2K系统兼容的缘故,使用的长度为4字节)。

本文就讲一讲这个奇怪的Bug。 继续阅读“虫趣:不同模块对指定变量类型的定义不同”

5,413 total views, no views today

虫趣:别动系统的奶酪——内核保护错误(CRITICAL_STRUCTURE_CORRUPTION)

欢迎转载:作者:张佩】【原文:http://www.yiiyee.cn/Blog/0x109-1/

引子

下班的时候准备关掉调试机,却遇到蓝屏。本想直接拔电源,但蓝屏总是让我好奇,于是决定多待十分钟,看看这个蓝屏是怎么回事。主机的windbg调试器已经用DML标记出了自动分析命令!analyze –v。于是点进去: 继续阅读“虫趣:别动系统的奶酪——内核保护错误(CRITICAL_STRUCTURE_CORRUPTION)”

37,685 total views, 1 views today

虫趣:拯救Visual Studio 2012(错误: 0xC01E0009)

欢迎转载:作者:张佩】【原文:http://www.yiiyee.cn/Blog/vs-1/

引子

今天运行一款很流行的第三方驱动更新软件(名称省略)时,提示我的显卡驱动需要更新。打开设备管理器一看,发现当前使用的这一版显卡驱动还是2012年的。果然是够老的。果断选择下载并安装。安装结束后,我没有选择立刻重启系统,因为还有一大堆工作需要继续。

一切都很正常地进行着,直到我启动了Visual Studio 2012。Splash画面持续了5秒钟之后,弹出程序崩溃对话框,并开始收集错误,然后弹出新的对话框,问我是否向微软提交本次崩溃信息。选择拒绝后,程序直接关闭。试过几次,都是如此。 继续阅读“虫趣:拯救Visual Studio 2012(错误: 0xC01E0009)”

4,467 total views, no views today

初学Windbg,从主题布局开始

欢迎转载:作者:张佩】【原文:http://www.yiiyee.cn/Blog/windbg-theme/

[download id=”4″]

Windbg把和调试相关的所有配置称为workspace,这些配置信息包括:调试窗口类型和位置,打开的文件和窗口位置,符号、源码和可执行文件的路径,以及断点设置等。Windbg中包含多种不同类型的workspace:

  1. 基本workspace。打开Windbg并且没有进行任何调试操作的情况下,使用这个workspace。
  2. 默认workspace。它分为默认的用户调试内核调试远程调试,三种不同类型的默认workspace。
  3. 处理器workspace。内核调试时,根据处理器类型的不同,会配置不同的workspace。不同的处理器类型包括X86、X64和IA64。
  4. 命名workspace。可以把你的配置保存为一个命名的workspace保存在注册表中,并且在需要的时候应用它。Windbg软件本身也会根据你所调试的可执行程序或dump文件,自动保存为命名workspace。这就是为什么你调试了一次HelloWorld程序后,下次再次调试的时候,Windbg会自动打开很多相关的源文件,并自动加载符号的原因。

所有这些workspace的信息都被保存在注册表中,注册表的路径是: 继续阅读“初学Windbg,从主题布局开始”

8,674 total views, 1 views today