我正在WinXp VmWare會話中編譯一個vc8 C++項目。在RedHat VmWare會話中,它比gcc3.2慢很多,所以我正在查看任務管理器。這就是說我的編譯過程中有很大一部分是在內核中使用的。這聽起來並不正確。找出爲什麼一個進程花費在win32內核中的時間
是否有相當於Win32的strace?至少可以給我一個關於哪些內核函數被調用的概述。可能有些東西突出成爲罪魁禍首。
我正在WinXp VmWare會話中編譯一個vc8 C++項目。在RedHat VmWare會話中,它比gcc3.2慢很多,所以我正在查看任務管理器。這就是說我的編譯過程中有很大一部分是在內核中使用的。這聽起來並不正確。找出爲什麼一個進程花費在win32內核中的時間
是否有相當於Win32的strace?至少可以給我一個關於哪些內核函數被調用的概述。可能有些東西突出成爲罪魁禍首。
不完全一致,但是有一種方法可以獲得內核調用堆棧的可見性,並且通過在高CPU使用率時對其進行抽樣,通常可以估計總是使用的內容。
安裝Process Explorer並確保您使用符號服務器支持進行配置。你可以這樣做:
下面是符號路徑爲例值:
SRV*C:\symbolcache*http://msdl.microsoft.com/download/symbols
(你可以_NT_SYMBOL_PATH環境變量設置爲相同的值有調試工具使用相同的符號服務器和高速緩存路徑)此路徑當系統詢問本地沒有符號的模塊的符號時,會導致dbghelp.dll將符號下載到本地磁盤。
像這樣設置了Process Explorer後,您可以獲取進程的屬性,轉到線程選項卡,然後雙擊最繁忙的線程。這將導致Process Explorer暫時掛鉤進程並掃描線程的堆棧,然後查找堆棧上各種返回地址的符號。返回地址的符號和模塊名稱(對於非MS第三方驅動程序)應該爲您提供有關CPU時間花費的強大線索。
Windows Resource Kit包含一個名爲kernrate
的工具。這是一個採樣分析器。它可以分析整個系統或特定的過程。默認情況下,其分辨率位於模塊級別,但可以調整爲幾個字節。你應該沒有問題,因爲你會發現哪些模塊/驅動程序大部分時間都在使用。
Here是關於它的使用的一些信息。
VmWare的支持應該解決這個問題。它可能是VmWare實現中的某個地方。
你可以使用例如IrpTracker來給你一個想法在內核中發生了什麼。 另一種選擇是使用內核調試器,即WinDbg。如果CPU的負載非常高,只需在調試器中隨機打開並查看調用堆棧,就可以知道誰是CPU負載的驅動程序。但正如我所說,我會猜測它將是一些VmWare組件。值得檢查一下,如果問題仍然存在於WinXP上的同一臺計算機上而沒有仿真。
我不建議使用WinDbg。 Process Explorer自動轉儲*運行*應用程序的堆棧。它只需要WinDbg中的dbghelp.dll;它不會使用其他任何東西。 – 2008-11-28 11:18:03
kernrate的更新版本位於Windows驅動程序工具包中。 – bk1e 2008-11-27 20:13:35