【问题标题】:Details of a thread in PowershellPowershell 中线程的详细信息
【发布时间】:2014-01-26 23:22:55
【问题描述】:

如何通过 powershell 获取进程中运行的所有线程的 CPU 消耗,格式类似于此

运行gwmi win32_thread|select -First 1 时找不到任何处理器信息。而Start Address 是数字!?!

【问题讨论】:

  • @Neolisk 这可以通过 Powershell 实现吗?
  • @ShayLevy 任何想法......
  • @RRUZ http://stackoverflow.com/questions/10159516/get-thread-start-address?answertab=active#tab-top 中的代码最接近我正在寻找的内容。但是我如何通过 Powershell 和远程机器运行它。

标签: powershell windbg remote-server query-performance powershell-4.0


【解决方案1】:

阿扬; 你看过 Codeplex 上的 PowerDbg 吗?

http://powerdbg.codeplex.com/

【讨论】:

  • 这使您能够通过 Powershell 控制 Windbg。需要获取 Procdump 来获取给定进程的线程详细信息。我希望实时获取线程详细信息;从机器的内存中。就像 Process Explorer。
【解决方案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.dllPSExec 来访问远程机器。

【讨论】:

  • Jagos 似乎已经想通了。 processhacker.sourceforge.net/forums/… 但我无法复制解决方案。你能不能试试看。
  • 这些 Process Explorer 替代方案都没有能力显示 CPU 利用率和线程的Start Address
【解决方案3】:

不确定这是否可以通过开箱即用的 powershell 完成,但由于您提供赏金,我建议您查看 Process Hacker 的源代码。

http://processhacker.sourceforge.net/

IIRC 进程黑客是用 C 语言编写的,并且完全开源。

Clear the windows 7 standby memory programmatically

【讨论】:

  • 我还要提到我在 W7 上使用 Win32_Thread 没有成功,当从 powershell 或 wmi 代码创建器进行测试时,每个查询都会导致错误/失败。即没有结果
  • 这里提到了一段代码。 stackoverflow.com/questions/10159516/… 但是,我无法运行它。你能告诉我是否有办法从 Powershell 运行它。我可能不得不编译代码。虽然,我可以运行 gwmi win32_thread|select -First 1 StartAddress: 1415399312 但我不知道如何将起始地址转换为函数。
  • 我是一名管理员;主要是部署、备份、集群和可视化。我无法从 Process Hacker 源代码中找出哪个命令或函数负责检索线程的 Start Address。我可以从 Powershell 控制台运行的一段代码,无论是什么,都会非常有帮助。
  • 不确定这些特定进程是否需要 SeDebugPrivilege。但是,您可以通过以下方式使用 powershell 即时授予它。 superuser.com/questions/693620/…Enable-Privilege SeDebugPrivilege
  • 授予什么?哪些进程?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
相关资源
最近更新 更多