我正在WinXp VmWare会话中编译vc8 C ++项目。在RedHat VmWare会话中,它比gcc3.2慢得多,所以我在看任务管理器。它说我的编译过程中有很大一部分花在内核上。这对我来说听起来不对。
Win32是否有相同的strace?至少可以让我概述一下正在调用哪些内核函数。可能有一些突出的东西是罪魁祸首。
答案 0 :(得分:3)
Windows Resource Kit包含一个名为kernrate
的工具。这是一个抽样分析器。它可以描述整个系统或特定过程。默认情况下,其分辨率在模块级别上,但可以调整为几个字节。您可以使用默认分辨率,因为您将看到哪些模块/驱动程序在大多数时间都在消耗。
Here是关于其使用的一些信息。
答案 1 :(得分:2)
不完全是strace,但是有一种方法可以看到内核调用堆栈,并且在CPU使用率很高的时候对它进行采样,你通常可以估算出什么时候用完了。
安装Process Explorer并确保使用符号服务器支持对其进行配置。您可以通过以下方式执行此操作:
以下是符号路径的示例值:
SRV*C:\symbolcache*http://msdl.microsoft.com/download/symbols
(您可以将_NT_SYMBOL_PATH环境变量设置为相同的值,以使调试工具使用相同的符号服务器和缓存路径。)此路径将导致dbghelp.dll在询问模块的符号时将符号下载到本地磁盘本地没有符号。
在设置了这样的Process Explorer之后,您可以获得进程的属性,转到threads选项卡,然后双击最繁忙的线程。这将导致Process Explorer暂时挂入进程并扫描线程的堆栈,然后查找堆栈上各种返回地址的符号。返回地址的符号和模块名称(对于非MS第三方驱动程序)应该为您提供有关CPU时间花费的强大线索。
答案 2 :(得分:0)
VmWare支持应该解决这个问题。它可能在VmWare实现中的某个地方。
您可以使用例如IrpTracker来了解内核中发生的事情。 另一种选择是使用内核调试器,即WinDbg。如果cpu加载非常高,只是在调试器中随机中断并查看调用堆栈可以让你知道谁是cpu加载背后的驱动程序。但正如我所说,我猜它将是一些VmWare组件。值得检查WinXP上的同一台计算机上是否存在问题,而不进行仿真。