如何通过powershell以类似于
的格式获取进程中运行的所有线程的CPU消耗
我运行gwmi win32_thread|select -First 1
时找不到任何处理器信息。 Start Address
是数字!?!
答案 0 :(得分:2)
阿燕; 你看过Codeplex上的PowerDbg吗?
答案 1 :(得分:2)
显示与Process Explorer相同的详细信息
您提供的屏幕截图似乎是Process Explorer的屏幕截图,而不是任务管理器的屏幕截图。这会使事情变得更复杂,因为(如果我没记错的话)Process Explorer使用内核驱动程序来获取有关系统的详细信息,以便比Windows更精确地计算CPU时间。 我手边没有这本书,但这应该在Windows Sysinternals Administrator's Reference中进行描述。
将起始地址转换为DLL和方法
如名称所示,起始地址是一个地址。通常它会以十六进制格式显示,但实际上它只是一个数字,因此在您的情况下它可能是数字。转换为Hex是没问题的。
如果要将数字转换为有用的名称(如DLL名称和方法名称),则需要使用符号。请参阅截图:Process Explorer还需要下载符号,否则偏移量是从DLL开始计算的(如van.dll+1c904
中所示)。
为了处理符号,Process Explorer使用名为dbghelp.dll
的Microsoft DLL。您已在Options/Configure symbols...
中对其进行了配置。如果您愿意,可以使用相同的DLL,但我会说这是您停止使用Powershell的地方,因为dbghelp.dll
是本机DLL而不能被.NET使用。您甚至无法在Visual Studio中创建.NET互操作程序集,因为它不是COM DLL。
此外,Process Explorer将另一个魔法应用于起始地址的显示值:通常起始地址始终相同:某些Microsoft代码创建一个Thread对象,然后调用特定于应用程序的代码。 Process Explorer向上遍历堆栈跟踪并在调用堆栈上显示第一个非Microsoft框架。我不确定WMI所提供的地址是否也是一样的。
如果您想尝试dbghelp.dll
,那么从地址转换为DLL的方法应为IDebugSymbols::GetNameByOffset()。
另请注意,从地址到方法的转换需要在远程计算机上完成,因为只有远程计算机才能知道加载了哪个DLL的确切版本。然后,还要考虑远程计算机需要Internet访问才能从Microsoft服务器下载符号。
远程执行
在您提到的评论中,您希望在远程计算机上执行该命令。 Process Explorer不支持远程计算机。虽然我不确定原因,但我的猜测是它只能通过WMI访问远程PC - 因此会遇到与你相同的限制。
但是,有一些alternatives to Process Explorer, discussed in the Process Explorer Forum。他们似乎也受到WMI限制,但你可能会尝试一下。 除此之外,您还可以使用SysInternals PsExec在远程计算机上执行程序。
总体结论
我想预期的解决方案太复杂了,无法在StackOverflow上得到解答,特别是如果工具集仅限于Powershell。它至少需要C ++来集成dbghelp.dll
以及PSExec
来访问远程机器。
答案 2 :(得分:1)
不确定这是否可以使用PowerShell开箱即用,但由于您提供赏金,我建议您查看Process Hacker的源代码。
http://processhacker.sourceforge.net/
IIRC进程黑客是用C语言编写的,并且是完全开源的。