記一次 .NET 某企業OA后端服務 卡死分析( 三 )

仔細觀察線程棧會很驚訝的發現,居然還能卡在 System.Console.WriteLine 方法上,挺奇怪的 , 為了探究原因,我們使用 k 命令看下非托管棧 。
0:053> k 5 # Child-SP          RetAddr               Call Site00 00000070`505bddd8 00007ffd`a32febda     ntdll!NtWriteFile+0x1401 00000070`505bdde0 00007ffd`32a7cbe2     KERNELBASE!WriteFile+0x7a02 00000070`505bde50 00007ffd`3a2d6971     0x00007ffd`32a7cbe203 00000070`505bdf20 00007ffd`3a2d672f     System_Console!System.ConsolePal.WindowsConsoleStream.WriteFileNative+0x6104 00000070`505bdf80 00007ffd`377c05d9     System_Console!System.ConsolePal.WindowsConsoleStream.Write+0x3f0:053> ub ntdll!NtWriteFile+0x14ntdll!NtDeviceIoControlFile+0x15:00007ffd`a70df755 cd2e            int     2Eh00007ffd`a70df757 c3              ret00007ffd`a70df758 0f1f840000000000 nop     dword ptr [rax+rax]ntdll!NtWriteFile:00007ffd`a70df760 4c8bd1          mov     r10,rcx00007ffd`a70df763 b808000000      mov     eax,800007ffd`a70df768 f604250803fe7f01 test    byte ptr [SharedUserData+0x308 (00000000`7ffe0308)],100007ffd`a70df770 7503            jne     ntdll!NtWriteFile+0x15 (00007ffd`a70df775)00007ffd`a70df772 0f05            syscall從上面的 syscall 系統調用關鍵詞看,代碼是將用戶態的 ntdll!NtWriteFile 切到入了內核態的 nt!NtWriteFile 方法 , 那進入了內核態為什么沒有返回呢? 這又是一個值得思索的問題 。
2. 為什么進入了內核態無返回其實 ntdll!NtWriteFile 這個 win32 api 方法的第一個參數是一個 handle 的文件句柄,簽名如下 。
__kernel_entry NTSYSCALLAPI NTSTATUS NtWriteFile(  [in]           HANDLE           FileHandle,  [in, optional] HANDLE           Event,  [in, optional] PIO_APC_ROUTINE  ApcRoutine,  [in, optional] PVOID            ApcContext,  [out]          PIO_STATUS_BLOCK IoStatusBlock,  [in]           PVOID            Buffer,  [in]           ULONG            Length,  [in, optional] PLARGE_INTEGER   ByteOffset,  [in, optional] PULONG           Key);可能 handle 在內核中被別人占用了,可以用 !handle 查看下 rcx 寄存器 。
0:053> rrax=0000000000000008 rbx=00000070505bdf50 rcx=0000000000000418rdx=0000000000000000 rsi=0000000000000000 rdi=0000000000000418rip=00007ffda70df774 rsp=00000070505bddd8 rbp=00000070505bdf10 r8=0000000002000805  r9=0000000000000000 r10=0000020906191620r11=00000070505bc8f8 r12=0000000000000100 r13=0000000000000053r14=0000000000000077 r15=000002097adc54f0iopl=0         nv up ei pl zr na po nccs=0033  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246ntdll!NtWriteFile+0x14:00007ffd`a70df774 c3              ret0:053> !handle 0000000000000418 fHandle 0000000000000418  Type          File  Attributes    0  GrantedAccess 0x120196:         ReadControl,Synch         Write/Add,Append/SubDir/CreatePipe,WriteEA,ReadAttr,WriteAttr  HandleCount   3  PointerCount  65483  No object specific information available

推薦閱讀