【问题标题】:List running threads of an external process列出外部进程的运行线程
【发布时间】:2013-09-30 09:27:16
【问题描述】:

有时我们的客户有“幽灵”应用程序(这意味着当我们在很长一段时间后(例如 72 小时以上)关闭应用程序时,我们有时会看到应用程序在视觉上关闭但仍在进程列表中。

由于我们无法轻松重现,我们想知道哪个线程仍在运行。所以我们想提供一个非常小的工具,我们可以在其中选择一个进程(选择一个“幽灵”),然后显示我们可以获得的所有信息(主要运行的线程名称)。

所以:

  1. 这可能吗?我不知道 C# 应用程序是否可以访问 另一个应用程序的线程名称?
  2. 是否有任何现有的应用程序可以进行这种“提取”
  3. 我们应该使用什么来访问此类信息?

【问题讨论】:

  • 这是第三方应用程序吗? IE。一个你无法控制的?
  • 一些,其他不是,例如我们已经发现有一次线程在处理一个队列满的套接字时被 Windows 阻塞了
  • 不,我们开发了这个应用程序,但我们不想把这个工具放在应用程序中,因为:问题发生在我们关闭应用程序时,我们不想添加更多线程,我们想要一个诊断软件。
  • 好的,我只是在想,对于您自己的应用程序,应该始终可以确保在 GUI(主)线程退出之前关闭所有后台线程。我们自己的应用程序遇到了这个问题,直到我确保所有后台线程都已正确关闭,即使出现异常也是如此。
  • @Surfbutler,是的,那将是最好的,但我们目前没有一个集中的“管理器”来了解我们正在使用的所有线程。

标签: c# .net multithreading process


【解决方案1】:

正如 Justin Harvey 所说,Process explorer 是一个很好的解决方案。

如果您想提供自己的工具,您可能会对以下方面感兴趣:

Process.GetProcessByName()Process.Threads

用法

var process = Process.GetProcessByName("myprocess").FirstOrDefault();
var threads = process.Threads;

【讨论】:

    【解决方案2】:

    您可以尝试进程资源管理器,这将显示正在运行的进程中的线程的详细信息:

    http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

    【讨论】:

    • 有没有办法获得更多关于线程的信息?因为我不知道是否可以使用 StartAddress 提取代码中的位置,如果不能,我不确定如何将其用于当前问题
    【解决方案3】:

    虽然您可以像这样访问另一个进程的线程信息:

    Process[] p = Process.GetProcessesByName("YourProcess");
    foreach (ProcessThread thread in p[0].Threads)
    {
        Console.WriteLine(thread.Id);
    }
    

    无法访问线程的名称,但您可以检索ProcessThread 类中可用的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多