Шрифт:
Интервал:
Закладка:
-> PID: 908 Name: svchost
-> PID: 920 Name: smss
-> PID: 1016 Name: csrss
-> PID: 1020 Name: NVDisplay.Container
-> PID: 1104 Name: wininit
-> PID: 1112 Name: csrss
************************************
Исследование конкретного процесса
В дополнение к полному списку всех выполняющихся процессов на заданной машине статический метод Process.GetProcessById() позволяет получать одиночный объект Process по ассоциированному с ним идентификатору PID. В случае запроса несуществующего PID генерируется исключение ArgumentException. Например, чтобы получить объект Process, который представляет процесс с PID, равным 30592, можно написать следующий код:
// Если процесс с PID, равным 30592, не существует,
// то сгенерируется исключение во время выполнения.
static void GetSpecificProcess()
{
Process theProc = null;
try
{
theProc = Process.GetProcessById(30592);
}
catch(ArgumentException ex)
{
Console.WriteLine(ex.Message);
}
}
К настоящему моменту вы уже знаете, как получить список всех процессов, а также специфический процесс на машине посредством поиска по PID. Наряду с выяснением идентификаторов PID и имен процессов класс Process позволяет просматривать набор текущих потоков и библиотек, применяемых внутри заданного процесса. Давайте посмотрим, как это делается.
Исследование набора потоков процесса
Набор потоков представлен в виде строго типизованной коллекции ProcessThreadCollection, которая содержит определенное количество отдельных объектов ProcessThread. В целях иллюстрации добавьте к текущему приложению приведенный далее вспомогательный статический метод:
static void EnumThreadsForPid(int pID)
{
Process theProc = null;
try
{
theProc = Process.GetProcessById(pID);
}
catch(ArgumentException ex)
{
Console.WriteLine(ex.Message);
return;
}
// Вывести статистические сведения по каждому потоку
// в указанном процессе.
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})Console.WriteLine(
"Here are the threads used by: {0}", theProc.ProcessName);
ProcessThreadCollection theThreads = theProc.Threads;
foreach(ProcessThread pt in theThreads)
{
string info =
$"-> Thread ID: {pt.Id}tStart Time:
{pt.StartTime.ToShortTimeString()}tPriority:
{pt.PriorityLevel}";
Console.WriteLine(info);
}
Console.WriteLine("************************************n");
}
Как видите, свойство Threads в типе System.Diagnostics.Process обеспечивает доступ к классу ProcessThreadCollection. Здесь для каждого потока внутри указанного клиентом процесса выводится назначенный идентификатор потока, время запуска и уровень приоритета. Обновите операторы верхнего уровня в своей программе, чтобы запрашивать у пользователя идентификатор PID процесса, подлежащего исследованию:
...
// Запросить у пользователя PID и вывести набор активных потоков.
Console.WriteLine("***** Enter PID of process to investigate *****");
Console.Write("PID: ");
string pID = Console.ReadLine();
int theProcID = int.Parse(pID);
EnumThreadsForPid(theProcID);
Console.ReadLine();
После запуска приложения можно вводить PID любого процесса на машине и просматривать имеющиеся внутри него потоки. В следующем выводе показан неполный список потоков, используемых процессом с PID 3804, который (так случилось) обслуживает браузер Edge:
***** Enter PID of process to investigate *****
PID: 3804
Here are the threads used by: msedge
-> Thread ID: 3464 Start Time: 01:20 PM Priority: Normal
-> Thread ID: 19420 Start Time: 01:20 PM Priority: Normal
-> Thread ID: 17780 Start Time: 01:20 PM Priority: Normal
-> Thread ID: 22380 Start Time: 01:20 PM Priority: Normal
-> Thread ID: 27580 Start Time: 01:20 PM Priority: -4
…
************************************
Помимо Id, StartTime и PriorityLevel тип ProcessThread содержит дополнительные члены, наиболее интересные из которых перечислены в табл. 14.4.
- Понимание SQL - Мартин Грубер - Базы данных