Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

Windows内核调试

帖子发起人: Memory_code   发起时间: 2012-06-12 23:32 下午   回复: 10

Print Search
帖子排序:    
   2012-06-12, 23:32 下午
llkcll 离线,最后访问时间: 2019/11/29 2:23:52 Memory_code

发帖数前50位
注册: 2010-02-12
发 贴: 25
Indifferent [:|] 2k3下ExAllocatePoolWithTag分配分页内存的时候NumberOfBytes为0会不会有可能导致蓝屏~
Reply Quote
今天一个做服务器的网友说他用大蜘蛛扫描的时候多次蓝屏,由于是服务器用内核转储可能挂掉的时间会长点,所以他设置了小内存转储得到的信息很少……大概看一下是这样的:

Windows Server 2003 Kernel Version 3790 (Service Pack 2) MP (4 procs) Free x86 compatible
Product: Server, suite: Enterprise TerminalServer SingleUserTS
Built by: 3790.srv03_sp2_gdr.101019-0340
Machine Name:
Kernel base = 0x80800000 PsLoadedModuleList = 0x808a6ea8
Debug session time: Mon Jun 11 10:51:08.312 2012 (GMT+8)
System Uptime: 1 days 8:38:01.333

栈回溯:

0: kd> kvn 100
 # ChildEBP RetAddr  Args to Child             
00 b9b7ea14 b89c7a43 00000001 00000000 54505744 nt!ExAllocatePoolWithTag+0x83f (FPO: [3,12,4])
WARNING: Stack unwind information not available. Following frames may be wrong.
01 b9b7ea5c b89d5bd7 e3855e90 b9b7ea6c 00000000 dwprot+0xaa43
02 b9b7ea74 b89d5c5a 00000000 8b23b1c0 e3855e90 dwprot+0x18bd7
03 b9b7ea88 8093568c 00000000 8b23b1c0 e3855e90 dwprot+0x18c5a
04 b9b7eb04 80935d8c b9b7eb64 8b23b1c0 e3855e90 nt!ObpIncrementUnnamedHandleCount+0x1d8 (FPO: [SEH])
05 b9b7eb58 8093b80d e3855e90 001f0001 00000001 nt!ObpCreateUnnamedHandle+0x86 (FPO: [7,10,4])
06 b9b7ec54 809209e5 e3855e90 00000000 001f0001 nt!ObInsertObject+0xc1 (FPO: [6,51,4])
07 b9b7ed44 808897ec 000a3198 86ab0001 000bf5c8 nt!NtAcceptConnectPort+0x6b1 (FPO: [SEH])
08 b9b7ed44 7c95847c 000a3198 86ab0001 000bf5c8 nt!KiFastCallEntry+0xfc (FPO: [0,0] TrapFrame @ b9b7ed64)

再看一下环境:

0: kd> .trap 0xffffffffb9b7e964
ErrCode = 00000002
eax=00000000 ebx=8b5ad0c0 ecx=8b5ae170 edx=00000081 esi=8b5ad938 edi=e4ff63b0
eip=808933b7 esp=b9b7e9d8 ebp=b9b7ea14 iopl=0         nv up ei pl nz ac pe nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00010216
nt!ExAllocatePoolWithTag+0x83f:
808933b7 897004          mov     dword ptr [eax+4],esi ds:0023:00000004=????????

挂在了ExAllocatePoolWithTag上,原因应该是dwprot做了object hook,在内部处理的时候用ObQueryNameString获取对象名,然后直接用返回的NumberOfBytes申请内存,申请的时候挂了……但是问题是貌似看ExAllocatePoolWithTag的参数描述上NumberOfBytes小于PAGE_SIZE也是可以的吧……
另外一个DUMP貌似不是大蜘蛛的问题,但是不知道什么windbg下不到win32k的符号,难道没有?
2: kd> kb
ChildEBP RetAddr  Args to Child             
b8411ad0 bf898071 00000001 00000000 38306847 nt!ExAllocatePoolWithTag+0x83f
WARNING: Stack unwind information not available. Following frames may be wrong.
b8411ae4 bf897f5a 00000458 38306847 00000000 win32k+0x98071
b8411b00 bf885756 00000458 00000008 00000000 win32k+0x97f5a
b8411b54 bf85b0ef 00000001 00000100 00000000 win32k+0x85756
b8411ca4 bf85ab89 00000001 00000000 00000000 win32k+0x5b0ef
b8411d1c 808897ec 3a01036b 00000000 0000000e win32k+0x5ab89
b8411d1c 7c95847c 3a01036b 00000000 0000000e nt!KiFastCallEntry+0xfc
01b5ed98 00000000 00000000 00000000 00000000 0x7c95847c

还是一个地方,还是分页内存,0大小,挂在了同一个地方……不知道这个到底是怎么回事……是不是分页内存下面用0大小申请内存会不稳定或崩溃……??

IP 地址: 已记录   报告
   2012-06-14, 00:06 上午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 2k3下ExAllocatePoolWithTag分配分页内存的时候NumberOfBytes为0会不会有可能导致蓝屏~
Reply Quote

 是不可以分配0大小。DDK中有明确说明:

Note  Do not set NumberOfBytes = 0. Avoid zero-length allocations because they waste pool header space and, in many cases, indicate a potential validation issue in the calling code. For this reason, Driver Verifier flags such allocations as possible errors.

有什么特别需求要这么做么?

 


IP 地址: 已记录   报告
   2012-06-14, 12:17 下午
llkcll 离线,最后访问时间: 2019/11/29 2:23:52 Memory_code

发帖数前50位
注册: 2010-02-12
发 贴: 25
Re: 2k3下ExAllocatePoolWithTag分配分页内存的时候NumberOfBytes为0会不会有可能导致蓝屏~
Reply Quote
MSDN只是说会浪费池结构的空间吧……应该不会发生蓝屏这种错误才对,我写了一个驱动循环了几次好像也没见有蓝屏或者崩溃的现象~
IP 地址: 已记录   报告
   2012-06-27, 10:57 上午
WANGyu 离线,最后访问时间: 2012/9/10 3:34:00 王宇

发帖数前10位
男
注册: 2007-05-08
发 贴: 306
Re: 2k3下ExAllocatePoolWithTag分配分页内存的时候NumberOfBytes为0会不会有可能导致蓝屏~
Reply Quote
00 b9b7ea14 b89c7a43 00000001 00000000 54505744 nt!ExAllocatePoolWithTag+0x83f (FPO: [3,12,4])
01 b9b7ea5c b89d5bd7 e3855e90 b9b7ea6c 00000000 dwprot+0xaa43

未必真的是零。0x83f 已经执行的比较深了,往往是被优化“复用”了栈上的空间。

可以看一下 dwprot+0xaa43 call ExAllocatePoolWithTag 之前的代码,确定一下 Arg2。

IP 地址: 已记录   报告
   2012-07-01, 23:11 下午
llkcll 离线,最后访问时间: 2019/11/29 2:23:52 Memory_code

发帖数前50位
注册: 2010-02-12
发 贴: 25
Big Smile [:D] Re: 2k3下ExAllocatePoolWithTag分配分页内存的时候NumberOfBytes为0会不会有可能导致蓝屏~
Reply Quote
看了,的确不可能是0,碰到这种情况该怎么样……这种“优化”有什么具体的资料么……求教~
IP 地址: 已记录   报告
   2012-07-02, 23:23 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 2k3下ExAllocatePoolWithTag分配分页内存的时候NumberOfBytes为0会不会有可能导致蓝屏~
Reply Quote

这是NT内核常用的一种优化手段,没有深入了解过编译器的术语如何称呼这种优化,下面这个网页的描述还是很不错的:

http://www.codemachine.com/article_paramreuse.html

 


IP 地址: 已记录   报告
   2012-07-04, 08:17 上午
llkcll 离线,最后访问时间: 2019/11/29 2:23:52 Memory_code

发帖数前50位
注册: 2010-02-12
发 贴: 25
Crying [:'(] Re: 2k3下ExAllocatePoolWithTag分配分页内存的时候NumberOfBytes为0会不会有可能导致蓝屏~
Reply Quote
感谢上面两位的指导哈……明白了一点,但是为啥蓝屏的原因还是摸不清楚……
IP 地址: 已记录   报告
   2012-07-04, 17:19 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 2k3下ExAllocatePoolWithTag分配分页内存的时候NumberOfBytes为0会不会有可能导致蓝屏~
Reply Quote

基于现有的信息,基本要靠猜...

上传dump或者至少完整贴出!analyze -v的结果


IP 地址: 已记录   报告
   2012-07-04, 19:23 下午
llkcll 离线,最后访问时间: 2019/11/29 2:23:52 Memory_code

发帖数前50位
注册: 2010-02-12
发 贴: 25
Re: 2k3下ExAllocatePoolWithTag分配分页内存的时候NumberOfBytes为0会不会有可能导致蓝屏~

附件: Mini061112-01.zip
Reply Quote
0: kd> !analyze -v
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

KERNEL_MODE_EXCEPTION_NOT_HANDLED_M (1000008e)
This is a very common bugcheck.  Usually the exception address pinpoints
the driver/function that caused the problem.  Always note this address
as well as the link date of the driver/image that contains this address.
Some common problems are exception code 0x80000003.  This means a hard
coded breakpoint or assertion was hit, but this system was booted
/NODEBUG.  This is not supposed to happen as developers should never have
hardcoded breakpoints in retail code, but ...
If this happens, make sure a debugger gets connected, and the
system is booted /DEBUG.  This will let us see why this breakpoint is
happening.
Arguments:
Arg1: c0000005, The exception code that was not handled
Arg2: 808933b7, The address that the exception occurred at
Arg3: b9b7e964, Trap Frame
Arg4: 00000000

Debugging Details:
------------------


EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - 0x%08lx

FAULTING_IP:
nt!ExAllocatePoolWithTag+83f
808933b7 897004          mov     dword ptr [eax+4],esi

TRAP_FRAME:  b9b7e964 -- (.trap 0xffffffffb9b7e964)
ErrCode = 00000002
eax=00000000 ebx=8b5ad0c0 ecx=8b5ae170 edx=00000081 esi=8b5ad938 edi=e4ff63b0
eip=808933b7 esp=b9b7e9d8 ebp=b9b7ea14 iopl=0         nv up ei pl nz ac pe nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00010216
nt!ExAllocatePoolWithTag+0x83f:
808933b7 897004          mov     dword ptr [eax+4],esi ds:0023:00000004=????????
Resetting default scope

CUSTOMER_CRASH_COUNT:  1

DEFAULT_BUCKET_ID:  DRIVER_FAULT_SERVER_MINIDUMP

BUGCHECK_STR:  0x8E

PROCESS_NAME:  services.exe

CURRENT_IRQL:  0

LAST_CONTROL_TRANSFER:  from b89c7a43 to 808933b7

STACK_TEXT:  
b9b7ea14 b89c7a43 00000001 00000000 54505744 nt!ExAllocatePoolWithTag+0x83f
WARNING: Stack unwind information not available. Following frames may be wrong.
b9b7ea5c b89d5bd7 e3855e90 b9b7ea6c 00000000 dwprot+0xaa43
b9b7ea74 b89d5c5a 00000000 8b23b1c0 e3855e90 dwprot+0x18bd7
b9b7ea88 8093568c 00000000 8b23b1c0 e3855e90 dwprot+0x18c5a
b9b7eb04 80935d8c b9b7eb64 8b23b1c0 e3855e90 nt!ObpIncrementUnnamedHandleCount+0x1d8
b9b7eb58 8093b80d e3855e90 001f0001 00000001 nt!ObpCreateUnnamedHandle+0x86
b9b7ec54 809209e5 e3855e90 00000000 001f0001 nt!ObInsertObject+0xc1
b9b7ed44 808897ec 000a3198 86ab0001 000bf5c8 nt!NtAcceptConnectPort+0x6b1
b9b7ed44 7c95847c 000a3198 86ab0001 000bf5c8 nt!KiFastCallEntry+0xfc
007afe2c 00000000 00000000 00000000 00000000 0x7c95847c


STACK_COMMAND:  kb

FOLLOWUP_IP:
dwprot+aa43
b89c7a43 ??              ???

SYMBOL_STACK_INDEX:  1

SYMBOL_NAME:  dwprot+aa43

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: dwprot

IMAGE_NAME:  dwprot.sys

DEBUG_FLR_IMAGE_TIMESTAMP:  4e7c690b

FAILURE_BUCKET_ID:  0x8E_dwprot+aa43

BUCKET_ID:  0x8E_dwprot+aa43

Followup: MachineOwner
---------


还有一个内存dump,不过出的问题windbg显示貌似是文件系统的关系……
IP 地址: 已记录   报告
   2012-07-05, 12:11 下午
WANGyu 离线,最后访问时间: 2012/9/10 3:34:00 王宇

发帖数前10位
男
注册: 2007-05-08
发 贴: 306
Re: 2k3下ExAllocatePoolWithTag分配分页内存的时候NumberOfBytes为0会不会有可能导致蓝屏~
Reply Quote
dump 只是出错点的记录,不是破坏的第一现场。

能看出的大致信息是,问题出在 WRK \ntos\ex\pool.c 的 2391 行。

2391 :        Block = PrivateRemoveHeadList (ListHead);

宏 PrivateRemoveHeadList 会去取、操作 ListHead,而:

0: kd> dd 8b5ad938
8b5ad938  00000000 e4ff63b0 8b5ad940 8b5ad940
8b5ad948  8b5ad948 8b5ad948 8b5ad950 8b5ad950
8b5ad958  8b5ad958 8b5ad958 8b5ad960 8b5ad960
8b5ad968  8b5ad968 8b5ad968 8b5ad970 8b5ad970
8b5ad978  8b5ad978 8b5ad978 8b5ad980 8b5ad980

这个 e4ff63b0 是不对的。简单说一下:

出错前的上一条指令是:

808933b5 8906            mov     dword ptr [esi],eax

可以想象那时内存的情况是:

0: kd> dd 8b5ad938 
8b5ad938   e4ff63b0  e4ff63b0 8b5ad940 8b5ad940

此时,eax=00000000 esi=8b5ad938 edi=e4ff63b0

指令执行完之后,内存的状况是:

0: kd> dd 8b5ad938 
8b5ad938  00000000 e4ff63b0 8b5ad940 8b5ad940

可是继续执行下一句(FAULTING_IP)时,相当于写了零地址:

808933b7 897004          mov     dword ptr [eax+4],esi

结合上下文,可以得出 e4ff63b0 内部不应该是零:

0: kd> dd e4ff63b0
e4ff63b0  00000000 00000000 00000000 00000000
e4ff63c0  00000000 00000000 00000000 00000000
e4ff63d0  00000000 00000000 00000000 00000000

但是至于为什么会是零,这就不是 dump 里能轻易看出的了(dump 只是出错点的记录,而不是破坏时的第一现场)

上述 ListHead 源自:

    ListHead = &PoolDesc->ListHeads[ListNumber];

而 PPOOL_DESCRIPTOR 指针 PoolDesc 源自:

    if ((PoolType & SESSION_POOL_MASK) == 0) {
        PoolDesc = PoolVector[CheckType];
    }
    else {
        PoolDesc = ExpSessionPoolDescriptor;
    }

至于 PoolDesc 究竟是从 PoolVector 取值,还是从 ExpSessionPoolDescriptor 取值,以及值是什么,minidump 已经不得而知了:

0: kd> ln PoolVector 
(808aea88)   nt!PoolVector   |  (808aeaa0)   nt!ExpNonPagedPoolDescriptor
Exact matches:

0: kd> dd 808aea88
808aea88  ???????? ???????? ???????? ????????
808aea98  ???????? ???????? ???????? ????????

0: kd> ln ExpSessionPoolDescriptor 
(808afbe8)   nt!ExpSessionPoolDescriptor   |  (808afbf0)   nt!ExpSystemResourcesList
Exact matches:

0: kd> dd 808afbe8
808afbe8  ???????? ???????? ???????? ????????
808afbf8  ???????? ???????? ???????? ????????

IP 地址: 已记录   报告
   2012-07-05, 15:01 下午
llkcll 离线,最后访问时间: 2019/11/29 2:23:52 Memory_code

发帖数前50位
注册: 2010-02-12
发 贴: 25
Big Smile [:D] Re: 2k3下ExAllocatePoolWithTag分配分页内存的时候NumberOfBytes为0会不会有可能导致蓝屏~
Reply Quote
感谢LS的详细点拨~~~还有一些DUMP,还是感觉硬件可能有问题……不然猜不懂这些离奇的DUMP是怎么回事……
IP 地址: 已记录   报告
高端调试 » 软件调试 » Windows内核调试 » Re: 2k3下ExAllocatePoolWithTag分配分页内存的时候NumberOfBytes为0会不会有可能导致蓝屏~

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.