3

我需要知道 .NET 应用程序的哪个线程正在发疯。它几乎消耗了整个 CPU 时间。

问题:

  • 该应用程序正在远程 PC 上运行
  • 我对机器的唯一访问是通过 RDP
  • 客户站点上没有可用的 Visual Studio
  • 所以我无法通过远程调试连接
  • 但是,我可以将一些文件复制到机器上并在那里启动工具

我的问题:

  • 是否有可能“看到”(使用标准工具或我可以复制到机器的工具)
    • 哪个线程正在消耗所有 CPU 时间
    • 该线程调用了哪些方法?

在“其他操作系统”上,我可以创建一个实时调用堆栈或启动转储,以查看某个线程是否处于无限循环中。Windows 7 和 .NET 有这种可能性吗?

环境:

  • 视窗 7 (x86)
  • .NET 4.0

最好的问候和感谢

4

4 回答 4

2

是的,这是可能的。
如果进程是在 x86 操作系统上运行的 x86 进程或在 x64 操作系统上运行的 x64 进程,则只需要Process explorer

  1. 打开恶意应用程序的属性
  2. 切换到“线程”选项卡
  3. 按“CPU”排序
  4. 选择CPU使用率高的线程,点击“堆栈”。您现在应该看到该线程的托管堆栈。有关更多信息,请参阅此博客文章

如果该进程是 x64 操作系统上的 x86 进程,则会涉及更多。如果您需要此信息,请发表评论。

于 2012-12-11T11:33:16.203 回答
2

我们使用Sam 的独立 CPU 分析器,它分析 CPU 以查看它在做什么,生成一个文本文件。如果您有任何疑问,此代码昨天已作为 OSS 发布。

于 2012-12-11T11:38:19.857 回答
0

您可以使用(已安装的)perfmon.exe工具来监控每个线程的 CPU 利用率。

您可能还希望您的应用程序创建一个日志文件,该文件将某种线程名称与您创建的每个线程相关联,以便您知道哪个线程是哪个线程。

于 2012-12-11T11:32:24.440 回答
0

您无需安装 Visual Studio 即可使用远程调试器,因为它可作为独立工具使用。您可以:

  • 要求设置防火墙例外以允许“正常”使用远程调试器
  • 使用 PuTTy+freeSSHd 之类的东西在远程机器和你的机器之间建立一个反向隧道,然后在隧道上使用远程调试器。

您还可以使用进程资源管理器查看哪个线程正在占用所有 CPU 时间,但这只会给您一个相对无用的线程句柄,而不是告诉您有什么用处。

您可以做的另一件事是将物理机转换为 VM 映像,然后在本地启动该 VM 映像以进行测试。

于 2012-12-11T11:30:56.390 回答