我正在 WinXp VmWare 会话中编译一个 vc8 C++ 项目。在 RedHat VmWare 会话中,它比 gcc3.2 慢得多,所以我正在查看任务管理器。这就是说我的编译过程中有很大一部分花费在内核中。这对我来说听起来不对。
Win32 是否有 strace 的等价物?至少可以让我大致了解正在调用哪些内核函数。可能有一些突出的东西是罪魁祸首。
Windows Resource Kit contains a tool called kernrate
. It's a sampling profiler. It can profile entire system or a particular process. By default, its resolution is on a module level, but can be tuned down to several bytes. You should be fine with default resolution as you'll see which modules/drivers are consuming most of the time.
Here is some info regarding its use.
不完全是 strace,但有一种方法可以查看内核调用堆栈,并且通过在 CPU 使用率高的时候对其进行采样,您通常可以估计一直在用的东西。
安装Process Explorer并确保使用符号服务器支持对其进行配置。您可以通过以下方式做到这一点:
这是符号路径的示例值:
SRV*C:\symbolcache*http://msdl.microsoft.com/download/symbols
(您可以将 _NT_SYMBOL_PATH 环境变量设置为相同的值,以使调试工具使用相同的符号服务器和缓存路径。)该路径将导致 dbghelp.dll 在要求为不提供符号的模块提供符号时将符号下载到本地磁盘在本地有符号。
像这样设置 Process Explorer 后,您可以获取进程的属性,转到线程选项卡,然后双击最繁忙的线程。这将导致 Process Explorer 临时挂接到进程并扫描线程的堆栈,然后去查找堆栈上各种返回地址的符号。返回地址的符号和模块名称(对于非 MS 第三方驱动程序)应该为您提供有关 CPU 时间花费在何处的有力线索。
VmWare 支持应该解决这个问题。它可能在 VmWare 实现中的某个地方。
例如,您可以使用IrpTracker,它可以让您了解内核中发生了什么。另一种选择是使用内核调试器,即WinDbg。如果 cpu 负载非常高,只是在调试器中随机中断并查看调用堆栈可以让您知道谁是 cpu 负载背后的驱动程序。但正如我所说,我猜这将是一些 VmWare 组件。值得在没有仿真的情况下检查问题是否在 WinXP 上的同一台计算机上仍然存在。