Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

– > 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;

}

// Вывести статистические сведения по каждому потоку

// в указанном процессе.

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.

Прежде чем двигаться дальше, необходимо уяснить, что тип

ProcessThread
не является сущностью, применяемой для создания, приостановки или уничтожения потоков на платформе .NET Core. Тип
ProcessThread
скорее представляет собой средство, позволяющее получать диагностическую информацию по активным потокам Windows внутри выполняющегося процесса. Более подробные сведения о том, как создавать многопоточные приложения с использованием пространства имен
System.Threading
, приводятся в главе 15.

Исследование набора модулей процесса

Теперь давайте посмотрим, как реализовать проход по загруженным модулям, которые размещены внутри конкретного процесса. Когда речь идет о процессах, модуль — это общий термин, применяемый для описания заданной сборки

*.dll
(или самого файла
*.ехе
), которая обслуживается специфичным процессом. Когда производится доступ к коллекции
ProcessModuleCollection
через свойство
Process.Modules
, появляется возможность перечисления всех модулей, размещенных внутри процесса: библиотек на основе .NET Core, СОМ и традиционного языка С. Взгляните на показанный ниже дополнительный вспомогательный метод, который будет перечислять модули в процессе с указанным идентификатором PID:

Поделиться с друзьями: