Внутренние сведения о состоянии RPC
В этом разделе приводятся сведения о внутренней структуре сведений о состоянии, собираемых во время выполнения RPC.
Все сведения о состоянии среды выполнения RPC содержатся в ячейках. Ячейка — это наименьшая единица информации, которую можно просматривать и обновлять по отдельности.
Каждый объект ключа в Run-Time RPC будет содержать одну или несколько ячеек с информацией о его состоянии. Каждая ячейка имеет идентификатор ячейки. Когда объект ссылается на другой объект, он делает это путем указания идентификатора ячейки этого объекта. Ключевые объекты, о которых Run-Time RPC может хранить сведения, — это конечные точки, потоки, объекты подключения, объекты scall и клиентские вызовы (CCALL).
При запуске RPC-сервера Run-Time RPC прослушивает набор конечных точек, используя один или несколько рабочих потоков. Всякий раз, когда данные передаются на сервер, поток берет данные и определяет, что такое входящий запрос. Если запрос предназначен для создания соединения, создается объект Connection, и этот объект затем обслуживает все вызовы подключения. При вызове RPC для соединения объект Connection создает экземпляр объекта "Вызов сервера" (SCALL), соответствующий объекту "Вызов клиента" (CCALL). Затем этот объект вызова сервера обрабатывает этот конкретный вызов.
При запуске клиента RPC Run-Time RPC создает объект Client Call при каждом вызове. Этот объект Client Call содержит сведения об этом конкретном вызове.
Ячейки конечной точки
С точки зрения времени выполнения RPC конечная точка — это точка входа, через которую можно связаться с конкретным сервером. Конечная точка всегда связана с данным транспортом RPC. Сведения о состоянии конечной точки используются для связывания вызова клиента с определенным процессом на сервере.
Поля в ячейке конечной точки:
ProtseqType
Последовательность протоколов для этой конечной точки.
Статус
Значение состояния: выделенный, активный или неактивный. Большинство конечных точек активны. Конечная точка имеет выделенное состояние после начала процесса создания, но еще не завершена. Конечная точка неактивна , если она больше не используется (например, при удалении протокола).
EndpointName
Первые 28 символов имени конечной точки.
Ячейки потока
Потоки сервера — это рабочие потоки (стандартные потоки Win32 для RPC).
Поля в ячейке потока:
Статус
Значение состояния: processing, dispatched, allocated, or idle. Поток обработки — это поток, который находится в Run-Time и обрабатывает информацию. Отправляемый поток уже направил (вызывается) в подпрограмму диспетчера, предоставляемую сервером (обычно просто называемую серверной подпрограммой). Выделенный поток кэширован. Для запросов на обслуживание доступен простой поток.
LastUpdateTime
Время последнего обновления данных (в миллисекундах после загрузки).
TID
Идентификатор потока. Это полезно при попытке сопоставить со списком потоков в отладчике.
Ячейки объекта соединения
Поля в ячейке объекта соединения:
Флаги
К значениям флагов относятся монопольное/неисключимое, уровень проверки подлинности и служба проверки подлинности.
LastTransmitfragmentSize
Размер последнего фрагмента, передаваемого через соединение.
Конечной точки
Идентификатор ячейки конечной точки, из которую было выбрано это подключение.
LastSendTime
Время последней отправки данных по подключению.
LastReceiveTime
Время последнего получения данных по подключению.
Ячейки объектов вызова сервера
Поля в ячейке объекта SCALL:
Статус
Значение состояния: выделенный, активный или отправленный. Выделенный вызов неактивен и кэшируется. Если вызов активен, Run-Time RPC обрабатывает сведения, связанные с этим вызовом. При отправке вызова была вызвана подпрограмма диспетчера (серверная подпрограмма) и еще не возвращена.
ProcNum
Номер процедуры (номер операции, в файлах записи netmon) этого вызова. RPC Run-Time определяет отдельные подпрограммы из интерфейса путем их нумеровки по позиции в IDL-файле. Первой подпрограммой в интерфейсе будет нулевое число, вторая — номер один и т. д.
InterfaceUUIDStart
Первый параметр DWORD интерфейса UUID.
ServicingTID
Идентификатор ячейки потока, который обслуживает этот вызов. Если вызов не активен или не отправлен, он содержит устаревшие сведения.
CallFlags
Эти значения флагов указывают, является ли этот вызов кэшируемым в монопольном соединении, является ли этот вызов асинхронным, является ли вызовом канала и является ли это вызовом LRPC или OSF.
LastUpdateTime
Время (в миллисекундах после загрузки) последнего обновления сведений о состоянии вызываемого объекта.
PID
Идентификатор процесса вызывающего объекта. Допустимо только для вызовов LRPC.
TID
Идентификатор потока вызывающего объекта. Допустимо только для вызовов LRPC.
Ячейки объекта вызова клиента
Объект Client Call (CCALL) разбивается на две ячейки, так как сведения о вызове клиента слишком велики, чтобы поместиться в одну ячейку. Первая ячейка называется Сведения о вызове клиента, а вторая — сведениями о целевом вызове. Большинство инструментов будут отображать информацию вместе, поэтому вам не нужно различать их.
Сведения о вызовах клиентов не сохраняются, если только вы не собираете сведения о полном состоянии. Существует одно исключение из этого правила: сведения о клиентских вызовах, выполняемых в вызове сервера, сохраняются даже при сборе только сведений о состоянии сервера. Это позволяет отслеживать вызовы, охватывающие несколько прыжков.
Поля в ячейке Сведения о вызове клиента:
ProcNum
Номер процедуры (номер операции, в netmon-файлах записи) вызываемого метода. RPC Run-Time определяет отдельные подпрограммы из интерфейса путем их нумеровки по позиции в IDL-файле. Первой подпрограммой в интерфейсе будет нулевое число, вторая — номер один и т. д.
ServicingThread
Идентификатор ячейки потока, в котором выполняется этот вызов.
IfStart
Первое DWORD UUID интерфейса, по которому выполняется вызов.
Конечной точки
Первые 12 символов конечной точки на сервере, к которому был выполнен вызов.
Поля в ячейке Сведения о целевом объекте вызова:
ProtocolSequence
Последовательность протокола для этого вызова.
LastUpdateTime
Время (в миллисекундах после загрузки), когда были обновлены сведения о вызове клиента или целевом вызове.
TargetServer
Первые 24 символа имени сервера, к которому выполняется вызов.