Сведения файла журнала

Обновлен: Ноябрь 2007

Можно создать файлы журнала, в которые будут вестись запись действий для следующих операций:

  • Взаимодействие с машинным кодом.

  • Загрузка программ.

  • Работа в сети.

Сведения о разделах реестра, управляющих ведением журнала, и создании файлов журнала см. в разделе Пошаговое руководство. Создание файла журнала.

В этой главе описывается вывод, регистрируемый в файлах журнала при ведении журнала взаимодействия и загрузчика.

Файлы журнала взаимодействия

Вывод журнала взаимодействия состоит из подписей вызовов функций взаимодействия по мере их возникновения во время выполнения операций, включая сообщения об ошибках.

.NET Compact Framework версии 3.5 включает поддержку улучшенного ведения журнала взаимодействия, которая описывается в разделе "Глубокий маршалинг" ниже в этой главе.

Подписи функции

Выполняется запись как из управляемого в машинный, так и из машинного в управляемый код, включая следующие типы вызовов:

  • Вызовы неуправляемого кода

  • Вызовы COM vtable и Dispatch.

  • Обратные вызовы делегата.

Журнал взаимодействия может помочь исправить неполадки, когда выполняется вызов или возврат из вызова функции взаимодействия, например когда инициализирован неожидаемый параметр или программа непредвиденно завершает работу.

Вывод записи подписи функции состоит из трех строк для каждого вызова взаимодействия. Первая строка содержит флаги, указывающие тип выполненного вызова функции, и включает один или несколько следующих элементов:

  • [pinvokeimpl]
    Идентифицирует вызов из управляемого в машинный код, использующий атрибут DllImportAttribute.

  • [Ctor]
    Идентифицирует конструктор для класса сборки взаимодействия, созданного с помощью Программа импорта библиотек типов (Tlbimp.exe).

  • [preservesig]
    Предполагается, что функции управляемого и машинного кода имеют одинаковую подпись без преобразования из HRESULT в исключение, вызванное средой выполнения.

  • [delegate]
    Указывает, что функция является обратным вызовом делегата из машинного в управляемый код. Делегат действует как указатель функции в машинном коде.

Вторая строка файла журнала взаимодействия представляет управляемую подпись. Для вызовов функции из управляемого кода в машинный эта строка указывает управляемую функцию, которая вызывает машинный код. Для вызовов функции из машинного в управляемый код эта строка указывает управляемую функцию, которая вызывается из машинного кода.

Третья строка указывает подпись машинного кода, ожидаемого средой выполнения. Эта строка указывает типы данных для каждого параметра и предоставляет сведения о том, как маршалируются данные управляемого объекта. Для среды выполнения предполагается, что атрибутом DllImportAttribute или в определении подписи интерфейса COM указываются правильные типы. Сбой в определении правильных типов является распространенной ошибкой, которая может вызвать непредвиденное поведение, так как функция будет выполняться с неверными значениями параметров.

Каждый тип имеет тип маршалинга по умолчанию. Обратите внимание, что поведение маршалинга управляемого типа может отличаться для вызовов COM и DllImportAttribute или вызовов обратного вызова делегата. Чтобы изменить тип маршалинга по умолчанию, можно использовать атрибут MarshalAsAttribute. Также следует использовать ключевое слово ref, чтобы указать параметр, представляющий указатель на тип значения или указатель на указатель для ссылочного типа.

В следующей таблице приведен журнал взаимодействия вызова неуправляемого кода.

Номер строки и описание

Запись журнала

1 — тип вызова функции

[pinvokeimpl][preservesig]

2 — управляемая подпись

bool PlatformDetector::SystemParametersInfo(uint , uint , System.Text.StringBuilder , uint );

3 — машинная подпись

BOOLEAN (I1_WINBOOL_VAL) SystemParametersInfo(unsigned int (U4_VAL) , unsigned int (U4_VAL) , WCHAR * (STRINGBUILDER_LPWSTR) , unsigned int (U4_VAL) );

В следующей таблице показан журнал взаимодействия обратного вызова делегата.

Номер строки и описание

Запись журнала

1 — тип вызова функции

[preservesig][delegate]

2 — управляемая подпись

int WndProc::Invoke(WndProc , IntPtr , uint , uint , int );

3 — машинная подпись

int (I4_VAL) (*)(INT_PTR (I_VAL) , unsigned int (U4_VAL) , unsigned int (U4_VAL) , int (I4_VAL) )

В следующей таблице приведен журнал взаимодействия вызова функции COM из машинного в управляемый код, где среда выполнения возвращает ошибку HRESULT при возникновении управляемого исключения.

Номер строки и описание

Запись журнала

1 — тип вызова функции

(флаги отсутствуют)

2 — управляемая подпись

int N2MDualComponentImp.IN2MDualInterface::GetInt(N2MDualComponentImp.IN2MDualInterface This);

3 — машинная подпись

HRESULT GetInt(IN2MDualInterface *(INTF_VAL) this, [retval] int (I4_VAL) retval);

Глубокий маршалинг

Платформа .NET Compact Framework версии 3.5 также поддерживает глубокий маршалинг для журнала взаимодействия. В глубоком маршалинге в журнал записываются сведения об упакованных объектах, которые содержатся в структурах или ссылочных типах.

В следующем выводе журнала показан пример вызова неуправляемого кода, использующего маршалированные объекты, которые содержатся в структуре. Первая строка раздела глубокого маршалинга указывает причину вызова модуля глубокого маршалинга. В данном примере он был вызван для вычисления размера структуры. Журнал показывает тип данных и размер в байтах каждого объекта. Значение индекса (например, 0004) представляет смещения байтов для указанных переменных.

DEEP MARSHAL: Get size
struct interoplogging.MyStruct
{
0000: Int32 myVar as Int32 (4 bytes)
0004: Int32 myVar2 as Int32 (4 bytes)
0008: String myString as WCHAR[10] (20 bytes)
}
DEEP MARSHAL: Total size = 28 bytes

[pinvokeimpl][preservesig]
void  interoplogging.Form1::MyAPI(interoplogging.MyStruct );
void MyAPI(MyStruct (NONBLIT_VALUETYPE_VAL) );

DEEP MARSHAL: Managed -> Native
struct interoplogging.MyStruct
{
0000: Int32 myVar as Int32 (4 bytes)
0004: Int32 myVar2 as Int32 (4 bytes)
0008: String myString as WCHAR[10] (20 bytes)
}
DEEP MARSHAL: Total size = 28 bytes

Сообщения об ошибках

Некоторые ситуации и исключения могут вызывать сообщения об ошибках, которые будут записаны в файл журнала. Эти сообщения могут быть особенно полезны при изучении проблем, которые относятся к взаимодействию собственных компонентов и DLL, для которых недоступен машинный исходный код. Сообщения об ошибках можно использовать для помощи в решении проблем, возникающих в следующих ситуациях:

  • Вызовы функции из машинного в управляемый код.

  • Вызовы интерфейса COM среды выполнения. Ошибка HRESULT может быть возвращена в машинный код, когда вызвана функция интерфейса COM, реализованного средой выполнения. Имеется несколько интерфейсов, реализованных средой выполнения (включая IUnknown, IDispatch, IConnectionPointContainer, IEnumConnectionPoints и IConnectionPoint), которые может вызвать машинный код с помощью управляемого объекта, маршалированного как интерфейс COM. Когда вызов функции возвращает ошибку в машинный код в один из этих интерфейсов, среда выполнения выдает соответствующее сообщение об ошибке, включающее ошибку HRESULT и дополнительные связанные сведения.

  • Предполагается, что машинный код будет использовать неподдерживаемые функциональные возможности, такие как IDispatch::GetTypeInfo.

  • Нереализованные интерфейсы. Машинный код может получить ошибку E_NOINTERFACE из IUnknown::QueryInterface, где предполагается управляемый объект COM для реализованного дополнительного интерфейса. В этом случае также предоставляется идентификатор GUID реализованного интерфейса.

  • Управляемые исключения. Они возникают внутри вызова управляемой функции и приводят к ее преждевременному возвращению. При выполнении вызова COM среда выполнения преобразовывает исключение в значение HRESULT ошибки, которая возвращается в машинный код. Однако если обратный вызов делегата или вызов COM не ожидает значения, возвращаемого в составе HRESULT, невозможно гарантировать распознавание ими ошибки, и в результате может возникнуть непредсказуемое поведение. Журнал взаимодействия будет содержать сообщение об ошибке, когда исключение возникает во время вызова функции взаимодействия из машинного в изменяемый код. Это сообщение поможет определить управляемые функции, которым требуется дополнительная логика обработки ошибок для нормальной работы с машинным кодом. Управляемое исключение могут вызвать следующие факторы:

    • Использование типов в определении интерфейса COM или подписи DllImportAttribute, которые не поддерживаются платформой .NET Compact Framework, вызывают исключение во время процесса JIT-компиляции. Часто применяются альтернативные допустимые варианты, такие как использование IntPtr.

    • Если фактический объект невозможно привести к указанному типу в подписи или данные объекта невозможно преобразовать в требуемый тип, при вызове функции во время выполнения возникает исключение. Как правило, это происходит при преобразовании собственного объекта в управляемый объект.

    • Определение причины исключения при создании вызываемой оболочки среды выполнения (RCW) или вызываемой оболочки COM (CCW) представляет трудность. Файл журнала взаимодействия может помочь в определении причины этих проблем, управляемое исключение не содержит подробного сообщения об ошибке.

Отличия от .NET Framework

Существует различие между реализацией возможностей взаимодействия COM в платформах .NET Compact Framework и .NET Framework. Платформа .NET Compact Framework не поддерживает следующие возможности:

  • Создание оболочки CCW, которая содержит интерфейс без определенного идентификатора GUID.

  • Создание оболочки RCW для класса, наследуемого от класса сборки взаимодействия.

  • Создание оболочки CCW, которая содержит нестандартный интерфейс с универсальным методом.

Оболочки RCW обычно очищаются после завершения, но можно также использовать метод ReleaseComObject или FinalReleaseComObject, чтобы освободить оболочку RCW, связанную с объектом. Если применять эти расширенные параметры для управления временем жизни объектов и попытаться использовать объект после его освобождения для выполнения машинного вызова COM, создается исключение, и причина этого исключения будет указана в сообщении об ошибке в файле журнала.

Файлы журнала загрузчика

Файлы журнала загрузчика состоят из двух разделов: заголовка и текста. Заголовок файла журнала содержит следующие данные:

  • Имя главного исполняемого файла приложения.

  • Идентификатор процесса, назначенный операционной системой.

  • Дата и время создания файла журнала.

  • Версия платформы .NET Compact Framework, которая использовалась для запуска приложения.

  • Сведения о платформе, на которой выполняется приложение.

Текст файла журнала включает сведения диагностики о каждой сборке при ее загрузке приложением. Эти сведения могут помочь в поиске ошибок, обнаруженных загрузчиком класса при запуске приложения.

Текст файла журнала содержит следующие данные:

  • Состояние приведения, которое указывает, запущено ли приложение в режиме обратной совместимости.

  • Трассировка каждой загрузки сборки, включая местоположение, из которого выполнена загрузка, и загруженную версию.

  • Уровень доверия, назначенный каждому модулю при его загрузке.

  • Все файлы конфигурации, связанные с приложением.

  • Ошибка поиска методов, типов, сборок и модулей.

  • Ошибка поиска собственной библиотеки DLL или функции для вызова неуправляемого кода.

В следующей таблице приведен пример файла журнала загрузчика. Номера строк даны приблизительно.

Номер строки и описание

Запись журнала

1 — процесс

Process [\Program Files\VW\VW.exe]

2 — идентификатор процесса

Process ID [0x4d9585d2]

3 — дата

Date [2005/02/25]

4 — время

Time [18:33:14]

5 — версия .NET Compact Framework

NETCF [2.0.5035.00]

6 — платформа

Platform [Windows CE v4.20.1081 (PocketPC) WinCE4ARMV4 release Beta2 ARMV4 IJITv2]

7–14 — глобальные операции кэширования сборки

GAC: Updating GAC [0x0]

GAC: Checking .gac files inside [\Windows\]

GAC: Found [Microsoft .NET CF 2.0.GAC] .gac file.

GAC: Done with the file system check. Checking the registry.

GAC: Found [Microsoft .NET CF 2.0.GAC] registry entry.

GAC: Done with the registry check. Let's compare.

GAC: Entry [Microsoft .NET CF 2.0.GAC] is up to date.

GAC: GAC is up to date.

15 — режим совместимости (0.0.0.0 указывает запуск не в режиме совместимости)

Compatibility mode [0.0.0.0]

16 — загрузка модуля

Loading module [\Windows\GAC_mscorlib_v2_0_0_0_cneutral_1.dll]

17 — загруженный модуль

Loaded [mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=969DB8053D3322AC] from [\Windows\GAC_mscorlib_v2_0_0_0_cneutral_1.dll]

Последние две записи (загрузка и загруженный) регистрируются в журнале для каждого модуля. Они указывают сборки и их местоположения. Все ошибки из загрузки модуля указываются в журнале загрузчика.

Примеры ошибок

Два примера в этом разделе показывают, как можно использовать файл журнала загрузчика, чтобы определить, когда возникают ошибки.

В следующем примере показаны записи журнала, зарегистрированные, когда загрузчик не обнаружил сборку.

Loading module [\Program Files\VW\Golf.dll]
Attempt to load [\Program Files\VW\Golf.dll] has failed (err 0x80001000).
Loading module [\Program Files\VW\Golf.exe]
Attempt to load [\Program Files\VW\Golf.exe] has failed (err 0x80001000).
Failed to load [Golf, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]

В следующем примере показаны записи журнала, зарегистрированные, когда загрузчик не обнаружил конкретный тип.

Missing Type. Type [Cars.Jetta], Assembly [Cars].
Missing Type. Class [Cars.Jetta], Assembly [Cars, Version=5.0.0.0, 
Culture=neutral, PublicKeyToken=null].

См. также

Задачи

Пошаговое руководство. Создание файла журнала

Практическое руководство. Настройка версии среды выполнения

Основные понятия

Разделы руководства по платформе .NET Compact Framework

Другие ресурсы

Взаимодействие в платформе .NET Compact Framework

Производительность и диагностика в .NET Compact Framework