2010-09-12 130 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