仔细观察线程栈会很惊讶的发现,居然还能卡在 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
经验总结扩展阅读
- 奥运会每几年办一次
- 三伏贴只贴一次有效果吗 三伏贴要贴几次才有效果
- 三伏贴只贴中伏末伏有效果吗 三伏贴一次贴几个部位最佳
- 什么笔可以代替白板笔
- 一次性剃须刀哪里可以买到
- 奥运会一年一次吗
- 中国第一次举办奥运会是哪年
- AlexNet-文献阅读笔记
- 一次性口罩气味大是甲醛吗
- 奥运会几年举行一次?