怀疑visual studio的Threads窗口

时间:2010-09-12 14:59:41

标签: c++ visual-studio-2008

alt text

正如你在上面看到的那样,在同一个位置有4个win32线程,如何理解它? 的更新

7C92E4BE  mov         dword ptr [esp],eax 
7C92E4C1  mov         dword ptr [esp+4],0 
7C92E4C9  mov         dword ptr [esp+8],0 
7C92E4D1  mov         dword ptr [esp+10h],0 
7C92E4D9  push        esp  
7C92E4DA  call        7C92E508 
7C92E4DF  mov         eax,dword ptr [esp] 
7C92E4E2  mov         esp,ebp 
7C92E4E4  pop         ebp  
7C92E4E5  ret              
7C92E4E6  lea         esp,[esp] 
7C92E4ED  lea         ecx,[ecx] 
7C92E4F0  mov         edx,esp 
7C92E4F2  sysenter         
7C92E4F4  ret        

4 个答案:

答案 0 :(得分:4)

猜测,他们可能正在睡觉WaitForSingleObject或类似的东西。

答案 1 :(得分:1)

猜测,你有一个某种类型的线程池,所以你有四个线程都执行相同的线程函数。在这种情况下,所有四个都很可能是空闲的,等待他们需要执行的任务。如果是这样的话,所有四个都显示相同的位置是非常明智的。

答案 2 :(得分:1)

您需要忽略Microsoft代码启动的线程。我在你的屏幕截图中猜测mmsys或DirectX。 Microsoft代码非常高兴。

启用Microsoft Symbol Server后,您可以更好地诊断他们的操作。你会在Call Stack窗口中获得不错的名字,通常会让你猜出它们的目的是什么。当然,你永远不会看到他们的代码。

答案 3 :(得分:1)

调试器显示将要执行的下一个ring3处理器指令。在这种情况下,线程调用了sysenter,它对操作系统的内核进行ring0系统调用。在将控制权返回给调用代码之前,此内核系统调用正在等待某些事情发生。一旦发生这种情况,它将调用下一个用户模式指令,在这种情况下是ret。

如果您有4个线程都在同一个位置调用同一个函数来等待系统调用,那么您将有4个线程在Threads窗口中显示相同的地址。在Windows子系统构建的应用程序中经常会看到这种情况,Windows子系统通常有许多线程由Windows API启动,大部分时间都在等待内核事件。