找出进程在win32中花时间在内核中的原因

时间:2008-11-27 17:13:34

标签: winapi profiling kernel

我正在WinXp VmWare会话中编译vc8 C ++项目。在RedHat VmWare会话中,它比gcc3.2慢得多,所以我在看任务管理器。它说我的编译过程中有很大一部分花在内核上。这对我来说听起来不对。

Win32是否有相同的strace?至少可以让我概述一下正在调用哪些内核函数。可能有一些突出的东西是罪魁祸首。

3 个答案:

答案 0 :(得分:3)

Windows Resource Kit包含一个名为kernrate的工具。这是一个抽样分析器。它可以描述整个系统或特定过程。默认情况下,其分辨率在模块级别上,但可以调整为几个字节。您可以使用默认分辨率,因为您将看到哪些模块/驱动程序在大多数时间都在消耗。

Here是关于其使用的一些信息。

答案 1 :(得分:2)

不完全是strace,但是有一种方法可以看到内核调用堆栈,并且在CPU使用率很高的时候对它进行采样,你通常可以估算出什么时候用完了。

安装Process Explorer并确保使用符号服务器支持对其进行配置。您可以通过以下方式执行此操作:

  1. 安装WinDebug以获取更新的dbghelp.dll
  2. 通过在Options |中设置路径,将Process Explorer设置为使用此版本的dbghelp.dll配置Process Explorer的符号菜单。
  3. 同样在同一个对话框中,设置符号路径,使其包含MS符号服务器和本地缓存。
  4. 以下是符号路径的示例值:

    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上的同一台计算机上是否存在问题,而不进行仿真。