2010-09-12 126 views
1

alt text怀疑有关Visual Studio

正如你可以看到上面的线程窗口,有在完全相同的位置4个的Win32线程,怎么理解呢? UPDATE

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   

回答

1

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

如果您有4个线程都调用了等待系统调用的相同位置的相同函数,那么您将有4个线程在“线程”窗口中显示相同的地址。这是您在Windows子系统构建的应用程序中经常会看到的东西,它通常具有大量线程,这些线程由大部分时间用于等待内核事件的Windows API启动。

+0

位置字段是否总是指向**下一个**地址,或者只是在特殊情况下如'sysenter'? – COMer 2010-09-12 23:48:28

+0

当你在看反汇编,然后是,总是。即使你正在谈论“调用”指令,一旦它被调用,该指令就结束了。就处理器而言,操作已经完成;它将一个值压入堆栈并更改了IP寄存器。因此,如果您正在查看调用堆栈的那部分内容,调试器将指示代码从调用返回时将执行的下一条指令。 – Gerald 2010-09-13 03:05:21

+0

如果符号可用且位置显示函数/方法名称,如GrabberCB :: BufferCB,则表示它正在执行该函数/方法内的某些代码。 – Gerald 2010-09-13 03:10:31

4

在猜测,他们很可能睡在像WaitForSingleObject或相似。

+0

你能说明为什么'WaitForSingleObject'会让它们在同一个位置吗? – COMer 2010-09-12 15:07:40

+0

因为那是WaitForSingleObject函数将恢复到的用户模式地址。自己帮忙,然后右键单击带有该地址的某一行的呼叫树,然后选择“加载符号 - >来自Microsoft符号服务器”选项。 – 2010-09-12 15:12:47

+0

我刚刚在上面丢弃了更多汇编信息,而位置'7C92E4F4'是'ret',为什么它只停在那里? – COMer 2010-09-12 15:16:20

1

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

+0

我刚刚在上面丢弃了更多的程序集信息,而位置'7C92E4F4'是'ret',为什么它只停在那里? – COMer 2010-09-12 15:25:40

+0

这是下一个地址。它真的在“sysenter”处“停止”,这意味着它在内核模式下调用某些东西。执行从内核模式返回后执行'ret'。 – 2010-09-12 17:00:47

+0

确实位置字段总是指向**下一个**地址,或者只是在像'sysenter'这样的特殊情况下? – COMer 2010-09-12 23:44:12

1

您需要忽略由Microsoft代码启动的线程。我在屏幕截图中猜测mmsys或DirectX。微软的代码非常开心。

当您启用Microsoft Symbol Server时,您可以获得更好的诊断信息。你会在Call Stack窗口中获得体面的名字,通常让你猜猜他们的目的是什么。当然,你永远不会看他们的代码。

+0

函数名称在我加载MS的符号后被暴露出来,如果我喜欢,我可以去这些函数的定义,为什么你说'我永远不会看他们的代码'? – COMer 2010-09-12 23:46:54

+0

那么,从Redmond Vault获得源代码是特别的。我只能猜测你实际上看CRT或MFC或ATL代码。或者你自己的。 – 2010-09-12 23:59:16