我正在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