我正在运行一个简单的windows控制台应用程序:-当控件到达主站时,我转储了堆栈--
-我的主线程堆栈:
5840 0 Main Thread Main Thread Normal
console.exe!wmain(int argc=1, wchar_t * * argv=0x006831a0)
console.exe!__tmainCRTStartup()
console.exe!wmainCRTStartup()
kernel32.dll!@BaseThreadInitThunk@12()
ntdll.dll!___RtlUserThreadStart@8()
ntdll.dll!__RtlUserThreadStart@8()
__
上面的很好,为什么我在启动时看到这个??:
3740 0 Worker Thread Win32 Thread Normal
堆叠:
ntdll.dll!_KiFastSystemCallRet@0()
ntdll.dll!_ZwDelayExecution@8()
ntdll.dll!__LdrpInitialize@8()
ntdll.dll!_LdrInitializeThunk@8()
发布于 2011-02-13 14:24:38
LdrInitializeThunk是设置新线程的方法。我确实用VS2008创建了一个普通的Win32控制台应用程序(没有MFC,ATL),并且只得到一个线程。只有当我附加调试器时,我才会得到第二个调试器,因为调试器注入一个线程来启用进程的调试。这里一书中详细介绍了进程启动,其中没有提到需要第二个线程。异步过程调用装甲运兵车也是不可怪的。也许您的调用堆栈是使用并非所有加载的符号创建的,并且错误地怀疑调试器助手线程是应用程序中的一个隐藏线程。当您使用没有调试器的查看您的进程时,您应该只看到一个线程。
第6阶段:在新流程的上下文中执行进程初始化 KiInitializeContextThread由KeInitializeThread调用,它构建线程和线程的内核堆栈的初始上下文。新线程开始运行内核模式线程启动例程KiThreadStartup。(有关导致这种情况的线程启动步骤的更详细说明,请参见“CreateThread流”一节。)KiThreadStartup例程执行以下步骤:
https://stackoverflow.com/questions/4984401
复制相似问题