记一次 .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

经验总结扩展阅读