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
 
  易内核
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
沪ICP备11027180号

Windows内核调试

帖子发起人: jlflyfox   发起时间: 2009-02-04 14:21 下午   回复: 25

Print Search
帖子排序:    
   2009-02-04, 14:21 下午
jlflyfox 离线,最后访问时间: 2009-1-24 22:08:06 jlflyfox

发帖数前25位
注册: 2008-10-28
发 贴: 65
WaitForSingleObject导致BSOD?
Reply Quote

我有一个机器突然bsod了,我全部内存转储了,用windbg打开,发现应用层调用WaitForSingleObject导致内核出错

Symbol search path is: srv*c:\symbols*http://msdl.microsoft.com/download/symbols
Executable search path is:
Windows Server 2003 Kernel Version 3790 (Service Pack 1) MP (2 procs) Free x86 compatible
Product: Server, suite: Enterprise TerminalServer SingleUserTS
Built by: 3790.srv03_sp1_rtm.050324-1447
Kernel base = 0x80800000 PsLoadedModuleList = 0x808a6ea8
Debug session time: Wed Feb  4 09:11:55.328 2009 (GMT+8)
System Uptime: 0 days 0:17:40.906
Loading Kernel Symbols
.................................................................................................
Loading User Symbols
PEB is paged out (Peb.Ldr = 7ffd900c).  Type ".hh dbgerr001" for details
Loading unloaded module list
..................
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

Use !analyze -v to get detailed debugging information.

BugCheck 1A, {3452, 1099221, c088376c, 0}

Probably caused by : memory_corruption ( nt!MiDeleteAddressesInWorkingSet+155 )

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

1: kd> !analyze -v
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

MEMORY_MANAGEMENT (1a)
    # Any other values for parameter 1 must be individually examined.
Arguments:
Arg1: 00003452, The subtype of the bugcheck.
Arg2: 01099221
Arg3: c088376c
Arg4: 00000000

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


BUGCHECK_STR:  0x1a_3452

DEFAULT_BUCKET_ID:  DRIVER_FAULT

PROCESS_NAME:  notify.exe

CURRENT_IRQL:  0

LAST_CONTROL_TRANSFER:  from 8084c103 to 80827451

STACK_TEXT: 
b6210a8c 8084c103 0000001a 00003452 01099221 nt!KeBugCheckEx+0x1b
b6210c48 8084c24d 88f0ad88 88f0ad88 00000000 nt!MiDeleteAddressesInWorkingSet+0x155
b6210c68 8094b539 88f0afb0 88f977a8 00000001 nt!MmCleanProcessAddressSpace+0x111
b6210cf0 8094b5b7 00000001 b6210d4c 8082d8b8 nt!PspExitThread+0x5f1
b6210cfc 8082d8b8 88f977a8 b6210d48 b6210d3c nt!PsExitSpecialApc+0x1d
b6210d4c 80888cd4 00000001 00000000 b6210d64 nt!KiDeliverApc+0x1ae
b6210d4c 7c95ed54 00000001 00000000 b6210d64 nt!KiServiceExit+0x56
WARNING: Frame IP not in any known module. Following frames may be wrong.
014ef81c 7c952124 7c82baa8 00000ef4 00000000 0x7c95ed54
014ef890 7c82ba12 00000ef4 000493e0 00000000 0x7c952124
014ef8a4 0065dbb4 00000ef4 000493e0 ffffffff 0x7c82ba12
014ef97c 0065e43b 000493e0 00000000 00ec5168 0x65dbb4
014ef9b0 0065e37f 000493e0 00000000 00ec5168 0x65e43b
014ef9e8 0065e1fa 00ec54f0 000493e0 00ec54e8 0x65e37f
014efa08 0065810e 00ec54f0 000493e0 00000000 0x65e1fa
014efa3c 0050373a 000493e0 00000000 00ec5168 0x65810e
014eff2c 809a05fe 7ffdd000 00ec54a0 00000000 0x50373a
014eff5c 0065a6af 00000000 00ec5168 00ec5168 nt!DbgkCreateThread+0x3ac
014effa0 80a5762d 014effdc 006b8ca8 007370e8 0x65a6af
014effa0 00000000 014effdc 006b8ca8 007370e8 hal!HalpApcInterrupt+0xcd


STACK_COMMAND:  kb

FOLLOWUP_IP:
nt!MiDeleteAddressesInWorkingSet+155
8084c103 cc              int     3

SYMBOL_STACK_INDEX:  1

SYMBOL_NAME:  nt!MiDeleteAddressesInWorkingSet+155

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: nt

DEBUG_FLR_IMAGE_TIMESTAMP:  42435b14

IMAGE_NAME:  memory_corruption

FAILURE_BUCKET_ID:  0x1a_3452_nt!MiDeleteAddressesInWorkingSet+155

BUCKET_ID:  0x1a_3452_nt!MiDeleteAddressesInWorkingSet+155

Followup: MachineOwner
---------
1: kd> kv
ChildEBP RetAddr  Args to Child             
b6210a8c 8084c103 0000001a 00003452 01099221 nt!KeBugCheckEx+0x1b (FPO: [Non-Fpo])
b6210c48 8084c24d 88f0ad88 88f0ad88 00000000 nt!MiDeleteAddressesInWorkingSet+0x155 (FPO: [Non-Fpo])
b6210c68 8094b539 88f0afb0 88f977a8 00000001 nt!MmCleanProcessAddressSpace+0x111 (FPO: [Non-Fpo])
b6210cf0 8094b5b7 00000001 b6210d4c 8082d8b8 nt!PspExitThread+0x5f1 (FPO: [Non-Fpo])
b6210cfc 8082d8b8 88f977a8 b6210d48 b6210d3c nt!PsExitSpecialApc+0x1d (FPO: [Non-Fpo])
b6210d4c 80888cd4 00000001 00000000 b6210d64 nt!KiDeliverApc+0x1ae (FPO: [Non-Fpo])
b6210d4c 7c95ed54 00000001 00000000 b6210d64 nt!KiServiceExit+0x56 (FPO: [0,0] TrapFrame @ b6210d64)
WARNING: Frame IP not in any known module. Following frames may be wrong.
014ef81c 7c952124 7c82baa8 00000ef4 00000000 0x7c95ed54
014ef890 7c82ba12 00000ef4 000493e0 00000000 0x7c952124
014ef8a4 0065dbb4 00000ef4 000493e0 ffffffff 0x7c82ba12
014ef97c 0065e43b 000493e0 00000000 00ec5168 0x65dbb4
014ef9b0 0065e37f 000493e0 00000000 00ec5168 0x65e43b
014ef9e8 0065e1fa 00ec54f0 000493e0 00ec54e8 0x65e37f
014efa08 0065810e 00ec54f0 000493e0 00000000 0x65e1fa
014efa3c 0050373a 000493e0 00000000 00ec5168 0x65810e
014eff2c 809a05fe 7ffdd000 00ec54a0 00000000 0x50373a
014eff5c 0065a6af 00000000 00ec5168 00ec5168 nt!DbgkCreateThread+0x3ac (FPO: [Non-Fpo])
014effa0 80a5762d 014effdc 006b8ca8 007370e8 0x65a6af
014effa0 00000000 014effdc 006b8ca8 007370e8 hal!HalpApcInterrupt+0xcd (FPO: [0,2] TrapFrame @ ffffffff)
1: kd> .trap b6210d64
ErrCode = 00000000
eax=000000c0 ebx=00ec5168 ecx=00000000 edx=00000000 esi=00000ef4 edi=00000000
eip=7c95ed54 esp=014ef820 ebp=014ef890 iopl=0         nv up ei ng nz ac pe cy
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000297
001b:7c95ed54 ??              ???
1: kd> u 0x65a6af
0065a6af ??              ???
                ^ Memory access error in 'u 0x65a6af'
1: kd> d 0x65a6af
0065a6af  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

1: kd> .process
Implicit process is now 88f0ad88
1: kd> !process 88f0ad88
PROCESS 88f0ad88  SessionId: 0  Cid: 0d1c    Peb: 7ffd9000  ParentCid: 0e58
    DirBase: 7bb576c0  ObjectTable: 00000000  HandleCount:   0.
    Image: notify.exe
    VadRoot 88f2ba28 Vads 56 Clone 0 Private 30. Modified 589. Locked 0.
    DeviceMap e11cc388
    Token                             e1f6c030
    ElapsedTime                       00:02:35.296
    UserTime                          00:00:00.000
    KernelTime                        00:00:00.046
    QuotaPoolUsage[PagedPool]         37256
    QuotaPoolUsage[NonPagedPool]      2240
    Working Set Sizes (now,min,max)  (136, 50, 345) (544KB, 200KB, 1380KB)
    PeakWorkingSetSize                1794
    VirtualSize                       25 Mb
    PeakVirtualSize                   28 Mb
    PageFaultCount                    1820
    MemoryPriority                    BACKGROUND
    BasePriority                      8
    CommitCharge                      311

        THREAD 89d72300  Cid 0d1c.0e50  Teb: 00000000 Win32Thread: 00000000 RUNNING on processor 1
        Not impersonating
        DeviceMap                 e11cc388
        Owning Process            88f0ad88       Image:         notify.exe
        Wait Start TickCount      67898          Ticks: 0
        Context Switch Count      20            
        UserTime                  00:00:00.000
        KernelTime                00:00:00.000
        Win32 Start Address 0x006b62f2
        Start Address 0x7c82b5bb
        Stack Init b6211000 Current b62107dc Base b6211000 Limit b620e000 Call 0
        Priority 10 BasePriority 8 PriorityDecrement 0
        ChildEBP RetAddr 
        b6210a8c 8084c103 nt!KeBugCheckEx+0x1b (FPO: [Non-Fpo])
        b6210c48 8084c24d nt!MiDeleteAddressesInWorkingSet+0x155 (FPO: [Non-Fpo])
        b6210c68 8094b539 nt!MmCleanProcessAddressSpace+0x111 (FPO: [Non-Fpo])
        b6210cf0 8094b5b7 nt!PspExitThread+0x5f1 (FPO: [Non-Fpo])
        b6210cfc 8082d8b8 nt!PsExitSpecialApc+0x1d (FPO: [Non-Fpo])
        b6210d4c 80888cd4 nt!KiDeliverApc+0x1ae (FPO: [Non-Fpo])
        b6210d4c 7c95ed54 nt!KiServiceExit+0x56 (FPO: [0,0] TrapFrame @ b6210d64)
WARNING: Frame IP not in any known module. Following frames may be wrong.
        014ef81c 7c952124 0x7c95ed54
        014ef890 7c82ba12 0x7c952124
        014ef8a4 0065dbb4 0x7c82ba12
        014ef97c 0065e43b 0x65dbb4
        014ef9b0 0065e37f 0x65e43b
        014ef9e8 0065e1fa 0x65e37f
        014efa08 0065810e 0x65e1fa
        014efa3c 0050373a 0x65810e
        014eff2c 809a05fe 0x50373a
        014eff5c 0065a6af nt!DbgkCreateThread+0x3ac (FPO: [Non-Fpo])
        014effa0 80a5762d 0x65a6af
        014effa0 00000000 hal!HalpApcInterrupt+0xcd (FPO: [0,2] TrapFrame @ ffffffff)

 

我ida打开notify.exe,发现0x65dbb4前正好是在执行WaitForSingleObject,然后就调用kernel32.dll和ntdll.dll里面了,
这里有个小小疑惑,不过不影响大局,就是notify.exe没有pdb文件好理解,但为什么kernel32.dll和ntdll.dll里面为什么不能导出符号?

真正疑惑的是在内核执行怎么就出问题了,是peb被paged out了么?
光看PEB is paged out 和d 0x65a6af这些线索似乎可以这样认为,但系统到底出什么问题啦?我该怎么理解内核执行WaitForSingleObject就走到了KiServiceExit?


IP 地址: 已记录   报告
   2009-02-04, 15:20 下午
WANGyu 离线,最后访问时间: 2012-9-10 3:34:00 王宇

发帖数前10位
男
注册: 2007-05-08
发 贴: 306
Re: WaitForSingleObject导致BSOD?
Reply Quote

APC 的流程是:

KeInitializeApc  ->  KeInsertQueueApc  ->  Ki...


KiServiceExit 从内核态返回用户态前调用 KiDeliverApc 去“投递”APC:

kd> u KiServiceExit
nt!KiServiceExit:
8082351e fa              cli
8082351f f6457202        test    byte ptr [ebp+72h],2
80823523 7506            jne     nt!KiServiceExit+0xd (8082352b)
80823525 f6456c01        test    byte ptr [ebp+6Ch],1
80823529 7458            je      nt!KiServiceExit+0x65 (80823583)
8082352b 8b1d24f1dfff    mov     ebx,dword ptr ds:[0FFDFF124h]
80823531 c6435e00        mov     byte ptr [ebx+5Eh],0
80823535 807b3e00        cmp     byte ptr [ebx+3Eh],0
80823539 7448            je      nt!KiServiceExit+0x65 (80823583)
8082353b 8bdd            mov     ebx,ebp
8082353d 894344          mov     dword ptr [ebx+44h],eax
80823540 c743503b000000  mov     dword ptr [ebx+50h],3Bh
80823547 c7433823000000  mov     dword ptr [ebx+38h],23h
8082354e c7433423000000  mov     dword ptr [ebx+34h],23h
80823555 c7433000000000  mov     dword ptr [ebx+30h],0
8082355c b901000000      mov     ecx,1
80823561 ff15d0108080    call    dword ptr [nt!_imp_KfRaiseIrql (808010d0)]
80823567 50              push    eax
80823568 fb              sti
80823569 53              push    ebx
8082356a 6a00            push    0
8082356c 6a01            push    1
8082356e e86d5a0000      call    nt!KiDeliverApc (80828fe0)

楼主的 APC 显然是线程结束 APC,在清除工作集的时候蓝掉了。

我看了一下 2003 的 nt!MiDeleteAddressesInWorkingSet:

nt!MiDeleteAddressesInWorkingSet:
8083520e 8bff            mov     edi,edi
80835210 55              push    ebp
80835211 8bec            mov     ebp,esp
80835213 81ec10010000    sub     esp,110h
80835219 a120878a80      mov     eax,dword ptr [nt!MmWorkingSetList (808a8720)]
8083521e 83601c00        and     dword ptr [eax+1Ch],0
80835222 83a5f0feffff00  and     dword ptr [ebp-110h],0
80835229 57              push    edi
8083522a 6a02            push    2
8083522c 8d88a0060000    lea     ecx,[eax+6A0h]
80835232 a120878a80      mov     eax,dword ptr [nt!MmWorkingSetList (808a8720)]
80835237 5f              pop     edi
80835238 397808          cmp     dword ptr [eax+8],edi
8083523b 894dfc          mov     dword ptr [ebp-4],ecx
8083523e 0f82b0000000    jb      nt!MiDeleteAddressesInWorkingSet+0x128 (808352f4)
80835244 53              push    ebx
80835245 56              push    esi
80835246 8b4dfc          mov     ecx,dword ptr [ebp-4]
80835249 8b09            mov     ecx,dword ptr [ecx]
8083524b f6c101          test    cl,1
8083524e 747c            je      nt!MiDeleteAddressesInWorkingSet+0x100 (808352cc)
80835250 3b0d40e88980    cmp     ecx,dword ptr [nt!MmHighestUserAddress (8089e840)]
80835256 7374            jae     nt!MiDeleteAddressesInWorkingSet+0x100 (808352cc)
80835258 8bf1            mov     esi,ecx
8083525a c1ee0a          shr     esi,0Ah
8083525d 81e6fcff3f00    and     esi,3FFFFCh
80835263 81ee00000040    sub     esi,40000000h
80835269 f60601          test    byte ptr [esi],1
8083526c 0f8416830200    je      nt!MiDeleteAddressesInWorkingSet+0x12d (8085d588)
80835272 f6c502          test    ch,2
80835275 750c            jne     nt!MiDeleteAddressesInWorkingSet+0x7d (80835283)
80835277 8b4508          mov     eax,dword ptr [ebp+8]
8083527a 8b8010020000    mov     eax,dword ptr [eax+210h]
80835280 ff4818          dec     dword ptr [eax+18h]
80835283 8b5d08          mov     ebx,dword ptr [ebp+8]
80835286 81c3e8010000    add     ebx,1E8h
8083528c 53              push    ebx
8083528d 57              push    edi
8083528e e838a10000      call    nt!MiReleaseWsle (8083f3cb)
80835293 a120878a80      mov     eax,dword ptr [nt!MmWorkingSetList (808a8720)]
80835298 3b7804          cmp     edi,dword ptr [eax+4]
8083529b 0f82bb820200    jb      nt!MiDeleteAddressesInWorkingSet+0x97 (8085d55c)
808352a1 8b8df0feffff    mov     ecx,dword ptr [ebp-110h]
808352a7 89b48df4feffff  mov     dword ptr [ebp+ecx*4-10Ch],esi
808352ae 8b95f0feffff    mov     edx,dword ptr [ebp-110h]
808352b4 8b0e            mov     ecx,dword ptr [esi]
808352b6 898c9578ffffff  mov     dword ptr [ebp+edx*4-88h],ecx
808352bd ff85f0feffff    inc     dword ptr [ebp-110h]
808352c3 83bdf0feffff21  cmp     dword ptr [ebp-110h],21h
808352ca 7437            je      nt!MiDeleteAddressesInWorkingSet+0xe5 (80835303)
808352cc 8345fc04        add     dword ptr [ebp-4],4
808352d0 47              inc     edi
808352d1 3b7808          cmp     edi,dword ptr [eax+8]
808352d4 0f866cffffff    jbe     nt!MiDeleteAddressesInWorkingSet+0x38 (80835246)
808352da 83bdf0feffff00  cmp     dword ptr [ebp-110h],0
808352e1 5e              pop     esi
808352e2 5b              pop     ebx
808352e3 740f            je      nt!MiDeleteAddressesInWorkingSet+0x128 (808352f4)
808352e5 ff7508          push    dword ptr [ebp+8]
808352e8 8d85f0feffff    lea     eax,[ebp-110h]
808352ee 50              push    eax
808352ef e849460100      call    nt!MiDeletePteList (8084993d)
808352f4 5f              pop     edi
808352f5 c9              leave
808352f6 c20400          ret     4
808352f9 e821460100      call    nt!MiSessionRemoveProcess (8084991f)
808352fe 5e              pop     esi
808352ff c9              leave
80835300 c20400          ret     4
80835303 ff7508          push    dword ptr [ebp+8]
80835306 8d85f0feffff    lea     eax,[ebp-110h]
8083530c 50              push    eax
8083530d e82b460100      call    nt!MiDeletePteList (8084993d)
80835312 e96c8d0000      jmp     nt!MiDeleteAddressesInWorkingSet+0xf4 (8083e083)
80835317 56              push    esi
80835318 e8b8cbffff      call    nt!CcDeleteMbcb (80831ed5)
8083531d e91d7effff      jmp     nt!CcDeleteSharedCacheMap+0xd2 (8082d13f)
80835322 90              nop
80835323 90              nop
80835324 90              nop
80835325 90              nop
80835326 90              nop
80835327 90              nop
80835328 ff              ???
80835329 ff              ???
8083532a ff              ???
8083532b ffaddf9480c0    jmp     fword ptr [ebp-3F7F6B21h]
80835331 df9480ffffffff  fist    word ptr [eax+eax*4-1]
80835338 45              inc     ebp
80835339 e194            loope   nt!MiDeleteAddressesInWorkingSet+0x103 (808352cf)
8083533b 8058e194        sbb     byte ptr [eax-1Fh],94h
8083533f 80ffff          cmp     bh,0FFh
80835342 ff              ???
80835343 ffd1            call    ecx
80835345 e394            jecxz   nt!MiDeleteAddressesInWorkingSet+0x10f (808352db)
80835347 80e4e3          and     ah,0E3h
8083534a 94              xchg    eax,esp
8083534b 80ffff          cmp     bh,0FFh
8083534e ff              ???
8083534f ff89e394809c    dec     dword ptr [ecx-637F6B1Dh]
80835355 e394            jecxz   nt!MiDeleteAddressesInWorkingSet+0x11f (808352eb)
80835357 80837e04000f84  add     byte ptr [ebx+0F00047Eh],84h
8083535e 9aa5ffffe9a0a5  call    A5A0:E9FFFFA5
80835365 ff              ???
80835366 ff837dcc010f    inc     dword ptr [ebx+0F01CC7Dh]
8083536c 845164          test    byte ptr [ecx+64h],dl
8083536f 0200            add     al,byte ptr [eax]
80835371 ff75ec          push    dword ptr [ebp-14h]
80835374 ff75fc          push    dword ptr [ebp-4]
80835377 e86a370000      call    nt!MiInsertImageSectionObject (80838ae6)
8083537c e92d9f0000      jmp     nt!MmCreateSection+0x43c (8083f2ae)
80835381 90              nop
80835382 90              nop
80835383 90              nop
80835384 90              nop
80835385 90              nop

//
// nt!MiDeleteAddressesInWorkingSet+155
// 8084c103 cc              int     3
//
kd> u nt!MiDeleteAddressesInWorkingSet+0x110
nt!CcDeleteSharedCacheMap+0xd3:
8083531e 1d7effff90      sbb     eax,90FFFF7Eh
80835323 90              nop
80835324 90              nop
80835325 90              nop
80835326 90              nop
80835327 90              nop
80835328 ff              ???

我严重怀疑指针已经跑飞了... 原因不明。

另,Bug Check 0x1A: MEMORY_MANAGEMENT 的参数只公开了 参数1 ? 我一会查下源码。
The following parameters are displayed on the blue screen. Parameter 1 is the only parameter of interest; this identifies the exact violation.

MEMORY_MANAGEMENT (1a)
    # Any other values for parameter 1 must be individually examined.
Arguments:
Arg1: 00003452, The subtype of the bugcheck.
Arg2: 01099221
Arg3: c088376c
Arg4: 00000000

0x1     The fork clone block reference count is corrupt. (This only occurs on checked builds of Windows.)
0x3451  The PTEs of a kernel thread stack that has been swapped out are corrupted.


IP 地址: 已记录   报告
   2009-02-04, 15:38 下午
jlflyfox 离线,最后访问时间: 2009-1-24 22:08:06 jlflyfox

发帖数前25位
注册: 2008-10-28
发 贴: 65
Re: WaitForSingleObject导致BSOD?
Reply Quote
谢谢王宇,我再补充下我这个机器是AMD。
我刚才不理解执行到了nt!KiServiceExit,你的回答我才搞懂原来是执行完毕准备返回的时候出错的,汗,我水平太菜!
我执行下面这个,没有发现nt!KiServiceExit,而且也没有发现《调试软件》p180说的SYSCALL,估计是版本不一致吧
1: kd> u nt!ZwWaitForSingleObject
nt!ZwWaitForSingleObject:
8082f3dc b819010000 mov eax,119h
8082f3e1 8d542404 lea edx,[esp+4]
8082f3e5 9c pushfd
8082f3e6 6a08 push 8
8082f3e8 e8bd960500 call nt!KiSystemService (80888aaa)
8082f3ed c20c00 ret 0Ch

IP 地址: 已记录   报告
   2009-02-04, 21:29 下午
Raymond 离线,最后访问时间: 2017-6-26 4:49:15 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,299
Re: WaitForSingleObject导致BSOD?
Reply Quote
首先,解释一下楼主关于SYSCALL的疑问。SYSCALL是用来“进入”内核态的,你反汇编的内核中的ZwWaitForSingleObject函数,已经在内核态,所以不会有SYSCALL了。注意P180是反汇编用户态的NTDLL模块中的代码。

删除地址空间的动作是不会发生在要销毁进程中的。简单理解就是“同一把刀削不了它的刀柄”。《软件调试》P269对进程的退出和清理有一个很简单的描述。通常清理地址空间的动作应该是发生在系统进程和服务进程的。

建议使用kv命令观察一下MmDeleteProcessAddressSpace的第一个参数,这个参数应该是企图删除的地址空间所属的进程。所以,可以用!process 来观察是在删哪个进程。

另外,这个notify.exe是这台机器上有意安装的“正常程序”么?




IP 地址: 已记录   报告
   2009-02-05, 13:46 下午
jlflyfox 离线,最后访问时间: 2009-1-24 22:08:06 jlflyfox

发帖数前25位
注册: 2008-10-28
发 贴: 65
Re: WaitForSingleObject导致BSOD?
Reply Quote
谢谢Raymond!
SYSCALL那个我明白了,不过我那个dmp文件似乎无法正常获取ntdll的pdb,不知道是否是“PEB is paged out ”这个原因,现在还无法用u ntdll!WaitForSingleObject来验证,不过这个事情并不重要。

MmDeleteProcessAddressSpace是不是写错了,是MiDeleteAddressesInWorkingSet?还是MmCleanProcessAddressSpace?
1: kd> kv
ChildEBP RetAddr Args to Child
b6210a8c 8084c103 0000001a 00003452 01099221 nt!KeBugCheckEx+0x1b (FPO: [Non-Fpo])
b6210c48 8084c24d 88f0ad88 88f0ad88 00000000 nt!MiDeleteAddressesInWorkingSet+0x155 (FPO: [Non-Fpo])
b6210c68 8094b539 88f0afb0 88f977a8 00000001 nt!MmCleanProcessAddressSpace+0x111 (FPO: [Non-Fpo])

如果是前者,88f0ad88,这个就是notify.exe自己;
如果是后者,88f0afb0,这个用!process 看不到,我先怀疑是病毒,然后用
http://www.dbgtech.net:81/blog/?p=103 的介绍找隐藏进程,发现和!process 0 0 的确不一样,但多出来的都是普通进程---这个不一样也比较奇怪

那个notify.exe是我们自己的应用进程,那个机器老bsod,只是这次表象是它,另外一次bsod是因为oracle,我也简单分析了下,堆栈地方也差不多,只是IMAGE_NAME和MODULE_NAME是mfehidk,我查了下卖咖啡那个杀毒软件的。

那个机器2G物理内存,用/noexecute=optout开启了DEP和PAE,我现在修改成/execute了,如果还是不行,我打算换物理内存。

IP 地址: 已记录   报告
   2009-02-05, 15:43 下午
ckj1234 离线,最后访问时间: 2011-1-22 14:08:59 chen

发帖数前50位
注册: 2006-04-07
发 贴: 18
Re: WaitForSingleObject导致BSOD?
Reply Quote
to 王宇 >>我一会查下源码。

请问您的源代码 是什么版本的啊 windows Server 2003?
要是不违反相关规定或授权或者你自己收藏的,
能传到论坛上一份 那真是造福人民的好事啊
IP 地址: 已记录   报告
   2009-02-05, 18:00 下午
WANGyu 离线,最后访问时间: 2012-9-10 3:34:00 王宇

发帖数前10位
男
注册: 2007-05-08
发 贴: 306
Re: WaitForSingleObject导致BSOD?
Reply Quote

我来介绍一下市面上的源码。

市面上有泄露的(部分) NT 和 2K 微软内核源码,缺点是某些数据结构变化了,且无法编译、调试。

微软公开的 WRK 是可编译的,但是开源代码较少( http://advdbg.org/forums/1442/ShowPost.aspx ),且只对教育领域公开。KiSSinGGer 同学就曾经因为在 Blog 上张贴 WRK1.2v 源码包而被微软致信警告,我记得驱动开发网论坛上有 Znsoft 张贴的源码包 (我就纳闷了,微软为什么不警告马勇同学呢?)

许多同学是有源码而没有完整的光盘,光盘长这个模样 (感谢南京大学-夏耐博士/老师):




十七孔桥的结构的确很漂亮! 实际调试 WRK 是这样的:





可以看到源码路径里 KdInitSystem 是没有相应源码的,这是为什么呢? 唉,微软还是舍不得公开呀...

可是 Kd 模块多吸引人呀... 那怎么办? 只有反汇编、调试、外加参考老版本的源码喽:





好了,不多说了,以免给论坛引起不必要的麻烦。


IP 地址: 已记录   报告
   2009-02-05, 18:06 下午
jlflyfox 离线,最后访问时间: 2009-1-24 22:08:06 jlflyfox

发帖数前25位
注册: 2008-10-28
发 贴: 65
Re: WaitForSingleObject导致BSOD?
Reply Quote
各位高手,还是不要扯远啦,多看看我的问题啊!
IP 地址: 已记录   报告
   2009-02-05, 18:39 下午
WANGyu 离线,最后访问时间: 2012-9-10 3:34:00 王宇

发帖数前10位
男
注册: 2007-05-08
发 贴: 306
Re: WaitForSingleObject导致BSOD?
Reply Quote

呵呵 跑题了。

我再补充一些:

MiDeleteAddressesInWorkingSet 的参数是进程 - 88f0ad88

VOID
MiDeleteAddressesInWorkingSet (
    IN PEPROCESS Process
    )

/*++

Routine Description:

    This routine deletes all user mode addresses from the working set list.

Arguments:

    Process - Supplies a pointer to the current process.

Return Value:

    None.

Environment:

    Kernel mode, Working Set Lock held.

--*/

1: kd> .process
Implicit process is now 88f0ad88
1: kd> !process 88f0ad88
PROCESS 88f0ad88  SessionId: 0  Cid: 0d1c    Peb: 7ffd9000  ParentCid: 0e58

Owning Process            88f0ad88       Image:         notify.exe
Wait Start TickCount      67898          Ticks: 0
Context Switch Count      20     

大致判断为 notify.exe 结束的时候发生的蓝屏。所以,楼主尝试结束 notify.exe 进程了(或楼主的相应操作结束 notify.exe 进程了?)

notify.exe 进程是什么?

如果可以调试的话,用我的工具可以查出是谁结束的 notify.exe(http://advdbg.org/blogs/advdbg_system/articles/1217.aspx

如果楼主不是很着急的话,我可以帮你分析 Dump,因为我最近比较忙,新年刚来,全是事情。


IP 地址: 已记录   报告
   2009-02-05, 19:11 下午
jlflyfox 离线,最后访问时间: 2009-1-24 22:08:06 jlflyfox

发帖数前25位
注册: 2008-10-28
发 贴: 65
Re: WaitForSingleObject导致BSOD?
Reply Quote
谢谢!
应该是结束这个进程的时候出现了bsod
我是怎么追追究操作系统bsod的呢?
是这样,我的一个应用程序启动老失败,这个程序是Java,所以只有hslog文件,没有dmp,而这个进程为什么会被结束,每次都内存访问拒绝而退出。(那个Notify.exe也是java带起来的)
我怀疑是防毒软件干掉的。
有的时候似乎在被干掉的出现了操作系统bsod--这个是我怀疑的。
我现在怀疑bsod就是有内存交换的时候出现的,我把oracle的服务全部停止了,似乎机器就不容易重启,oracle很消耗内存。
还有一个疑问点就是,我用冰刀或者RkUnhooker,立即就挂了。
所以我怀疑你那个工具如果运行也会有此遭遇,你那个工具能分析dump文件么?
另外,我那个dump文件不着急,等你忙过来再帮我分析,我想学习点东西。
IP 地址: 已记录   报告
   2009-02-05, 20:48 下午
Raymond 离线,最后访问时间: 2017-6-26 4:49:15 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,299
Re: WaitForSingleObject导致BSOD?
Reply Quote

根据下面的汇编,MmCleanProcessAddressSpace和MmCleanProcessAddressSpace的第一个参数都是PEPROCESS:

8050f9d9 8b7508          mov     esi,dword ptr [ebp+8] ;MmCleanProcessAddressSpace入口把第一个参数放入ESI
8050fb59 56              push    esi
8050fb5a e89f4b0900      call    nt!MiDeleteAddressesInWorkingSet (805a46fe) ;调用MiDeleteAddressesInWorkingSet

也就说,这两个函数的参数应该是同一个值。现在不一样,有可能放在栈上的MmCleanProcessAddressSpace函数的参数被破坏了。

不管怎么样,应该可以肯定的是,这个BSOD是因为在notify.exe进程上下文中,执行MmCleanProcessAddressSpace删除notify.exe的进程空间时发生的,这是不合乎常规的。那么为什么会执行呢?现在看是因为那个APC。有可能是哪个坏蛋(或者发昏的好蛋:-))故意向notify.exe进程中queue了一个让其“自己剁自己脚”的APC。

建议执行下!apc看下系统中目前有哪些APC(也许已经看不到有问题这个了,但可以试试)。如果这个问题能复现,那么使用双机活动调试,会容易很多。

哪里可以下载这个DUMP么?王宇,如果有,可以上传一份给我

 

 


IP 地址: 已记录   报告
   2009-02-06, 09:19 上午
WANGyu 离线,最后访问时间: 2012-9-10 3:34:00 王宇

发帖数前10位
男
注册: 2007-05-08
发 贴: 306
Re: WaitForSingleObject导致BSOD?
Reply Quote

Raymond 老师 我也没有 DUMP 文件,我是看楼主贴出来的信息写的。楼主要是能上传一份就好了。

我又看了一下代码,的确是这样:

VOID
MmCleanProcessAddressSpace (
    IN PEPROCESS Process
    )
{
    ......

    //
    // Delete all the valid user mode addresses from the working set list.
    // At this point page faults are allowed on user space addresses but are
    // generally rare (would have to be an attached thread doing the
    // references).  Faults are allowed on page tables for user space, which
    // requires that we keep the working set structure consistent until we
    // finally take it all down.
    //

    MiDeleteAddressesInWorkingSet (Process);

    ......
}

但是栈上的信息显示,这两个值确实不同:

b6210c48 8084c24d 88f0ad88 88f0ad88 00000000 nt!MiDeleteAddressesInWorkingSet+0x155
b6210c68 8094b539 88f0afb0 88f977a8 00000001 nt!MmCleanProcessAddressSpace+0x111

的确是栈上的一些东西被破坏了。就像张老师说的那样,这个问题如果能复现,用双机调试或 SoftICE,就会真相大白的。 ^_^


IP 地址: 已记录   报告
   2009-02-06, 11:19 上午
jlflyfox 离线,最后访问时间: 2009-1-24 22:08:06 jlflyfox

发帖数前25位
注册: 2008-10-28
发 贴: 65
Re: WaitForSingleObject导致BSOD?
Reply Quote
两位,谢谢,我怎么上传给你们,
这个容易重现,但出问题的机器在外地,我无法双机调试。
我正在做一个试验,看是否是发生页面交换的时候就可能会出现问题。
按张老师的说法,我!apc看了下dump,或者按!vm尝试了下,感觉很奇怪,

1: kd> !apc
*** Enumerating APCs in all processes
Ignored in-page I/O error
Ignored in-page I/O error
1: kd> !vm

*** Virtual Memory Usage ***
Ignored in-page I/O error
Ignored in-page I/O error
Ignored in-page I/O error
IP 地址: 已记录   报告
   2009-02-06, 12:34 下午
Raymond 离线,最后访问时间: 2017-6-26 4:49:15 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,299
Re: WaitForSingleObject导致BSOD?
Reply Quote
如果上传,需要你自己找个FTP服务器。也可以尝试使用GMAIL,使用密码压缩,对于Kernel Dump可以压缩到10-20MB。我用GMAIL成功接收过20MB左右的DMP文件。在MiniDump目录里,总是还有一个小型的转储。你至少可以把那个小型转储用邮件来发送。我的EMAIL地址是:


IP 地址: 已记录   报告
   2009-02-06, 12:48 下午
WANGyu 离线,最后访问时间: 2012-9-10 3:34:00 王宇

发帖数前10位
男
注册: 2007-05-08
发 贴: 306
Re: WaitForSingleObject导致BSOD?
Reply Quote
我的邮箱是 wangyu@qihoo.net
IP 地址: 已记录   报告
  总页数 1 第 2 页 [共有 26 条记录] 1 2 >
高端调试 » 软件调试 » Windows内核调试 » Re: WaitForSingleObject导致BSOD?

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