次の方法で共有


ログ ファイル情報

更新 : 2007 年 11 月

ログ ファイルを作成して、次の操作のアクションを記録できます。

  • ネイティブ コードとの相互運用

  • プログラムの読み込み

  • ネットワーク

ログ記録方法およびログ ファイルの生成方法を制御するレジストリ キーについては、「方法 : ログ ファイルを作成する」を参照してください。

このトピックでは、相互運用およびローダー (読み込み) のログ記録について、ログ ファイルに書き込まれる出力内容を説明します。

相互運用ログ ファイル

相互運用ログへの出力の内容は、実行時に相互運用関数呼び出しが発生するたびに記録される呼び出しのシグネチャと、エラー メッセージです。

.NET Compact Framework Version 3.5 では、相互運用ログのサポートが強化されています。詳細については、このトピックの「詳細マーシャリング」セクションを参照してください。

関数シグネチャ

マネージからネイティブ、およびネイティブからマネージの両方の呼び出しについて、そのシグネチャがログに記録され、次の種類の呼び出しが含まれます。

  • プラットフォーム呼び出し

  • COM vtable 呼び出しおよび Dispatch 呼び出し

  • デリゲートのコールバック

相互運用ログを記録すると、相互運用関数呼び出しの呼び出しまたは返しにおける問題をトラブルシューティングできます。たとえば、パラメータが意図したとおりに初期化されなかった場合や、プログラムが予期せず終了した場合などです。

関数シグネチャ エントリは、相互運用呼び出しごとに 3 行出力されます。1 行目は、実行された関数呼び出しの種類を識別するためのフラグで、次の要素の少なくとも 1 つを含みます。

  • [pinvokeimpl]
    DllImportAttribute 属性を使用する、マネージからネイティブへの呼び出しを識別します。

  • [Ctor]
    タイプ ライブラリ インポータ (Tlbimp.exe) によって生成される、相互運用機能アセンブリ クラスのコンストラクタを識別します。

  • [preservesig]
    マネージ関数およびネイティブ関数のシグネチャは同じであり、ランタイムによる HRESULT から例外への変換がないと見なします。

  • [delegate]
    関数がネイティブからマネージへのデリゲートのコールバックであることを示します。デリゲートは、ネイティブ コード内で関数ポインタとして機能します。

相互運用ログ ファイルの 2 行目は、マネージ シグネチャです。マネージからネイティブへの関数呼び出しの場合、この行は、ネイティブ コードを呼び出すマネージ関数を示します。ネイティブからマネージへの関数呼び出しの場合、この行は、ネイティブ コードから呼び出されるマネージ関数を示します。

3 行目は、ランタイムで想定されるネイティブ シグネチャです。この行は、各パラメータのデータ型を示し、マネージ オブジェクトのデータがマーシャリングされる方法についての情報を含みます。ランタイムでは、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 Version 3.5 では、相互運用ログの詳細マーシャリングもサポートします。詳細マーシャリングでは、構造体または参照型に格納されたマーシャリング オブジェクトに関する情報が記録されます。

次のログ出力の例は、構造体に格納されたマーシャリング オブジェクトを使用するプラットフォーム呼び出しを示しています。詳細マーシャリング セクションの 1 行目は、詳細マーシャラが呼び出された理由を示します。この例では、構造体のサイズを計算するために呼び出しが行われました。ログでは、データ型とバイト単位のサイズがオブジェクト別に示されます。インデックス値 (例 : 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 インターフェイス呼び出し。ランタイムによって実装される COM インターフェイス関数が呼び出されると、ネイティブ コードに HRESULT エラーが返されることがあります。ネイティブ コードが、COM インターフェイスとしてマーシャリングされたマネージ オブジェクトを使用して呼び出すことができ、ランタイムによって実装されるインターフェイスには、IUnknownIDispatchIConnectionPointContainerIEnumConnectionPointsIConnectionPoint などがあります。関数呼び出しからネイティブ コードのこれらのインターフェイスに対してエラーが返された場合、HRESULT と追加の関連情報を含む適切なエラー メッセージが、ランタイムから出力されます。

  • サポートされていない機能を使用することが想定されているネイティブ コード。IDispatch::GetTypeInfo など。

  • 実装されていないインターフェイス。マネージ COM オブジェクトに追加インターフェイスが実装されていることが想定されている場合、ネイティブ コードは、IUnknown::QueryInterface から E_NOINTERFACE エラーを受け取ることがあります。この場合、実装されていないインターフェイスの GUID も示されます。

  • マネージ例外。これはマネージ関数の中で発生することがあり、そのために途中で戻ることがあります。COM 呼び出しが行われると、ランタイムは例外をエラーの HRESULT 値に変換してネイティブ コードに返します。ただし、デリゲート コールバックまたは COM 呼び出しが HRESULT 値が戻ることを想定していない場合、エラーが認識されるかどうかは不明であり、その結果、予期しない動作が発生することがあります。ネイティブからマネージへの相互運用関数呼び出し中に例外が発生すると、相互運用ログにエラー メッセージが記録されます。このメッセージを使用すると、ネイティブ コードとの相互運用が正しく行われるようにするためのエラー処理ロジックを追加する必要があるマネージ関数を特定できます。マネージ例外は、次のような要因によって生じることがあります。

    • COM インターフェイス定義内の型や DllImportAttribute シグネチャ内の型のうち、.NET Compact Framework でサポートされていない型を使用すると、JIT コンパイル プロセス中に例外が発生することがあります。IntPtr の使用のように、許容可能な代替方法が存在する場合もあります。

    • 実際のオブジェクトをシグネチャで指定された型に強制的に変換できない場合、またはオブジェクト データを要求された型に変換できない場合は、実行時に関数が呼び出されると、例外がスローされます。これは、通常、ネイティブ オブジェクトをマネージ オブジェクトに変換するときに発生します。

    • ランタイム呼び出し可能ラッパー (RCW: Runtime Callable Wrapper) または COM 呼び出し可能ラッパー (CCW: COM-callable wrapper) の作成時に、例外が発生する原因を特定することは困難です。相互運用ログ ファイルは、詳細なエラー メッセージがマネージ例外から得られないときに、これらの問題の原因を解決することに役立ちます。

.NET Framework と異なる点

COM 相互運用性に関する .NET Compact Framework 実装と .NET Framework 実装には、異なる点があります。.NET Compact Framework では、次の機能をサポートしていません。

  • GUID の指定がないインターフェイスを含む CCW の作成。

  • 相互運用アセンブリ クラスから継承されるクラスの RCW の作成。

  • ジェネリック メソッドによる非ジェネリック インターフェイスを含む CCW の作成。

通常、RCW は、終了処理時にクリーン アップされますが、オブジェクトに関連付けられた RCW を解放するために、ReleaseComObject メソッドまたは FinalReleaseComObject メソッドを使用することもできます。オブジェクトの有効期間を管理するためにこれらの高度なオプションを使用していて、ネイティブ COM 呼び出しを実行するためにオブジェクトを解放した後で、そのオブジェクトを使用しようとした場合、例外がスローされ、ログ ファイルには例外の原因に関するエラー メッセージが記録されます。

ローダー ログ ファイル

ローダー ログ ファイルは、ヘッダーと本文の 2 つのセクションで構成されます。ログ ファイルのヘッダーには、次のデータが含まれています。

  • アプリケーションの主要な実行可能ファイルの名前

  • オペレーティング システムによって割り当てられたプロセス ID

  • ログ ファイルが作成された日付と時刻

  • アプリケーションの実行に使用された .NET Compact Framework のバージョン

  • アプリケーションが実行されているプラットフォームに関する情報

ログ ファイルの本文には、アプリケーションでアセンブリが読み込まれるたびに、各アセンブリの診断情報が記録されます。この情報を使用して、アプリケーションの起動時にクラス ローダーで生じるエラーを見つけることができます。

ログ ファイルの本文には、次のデータが含まれています。

  • 強制変換の状態。アプリケーションが下位互換性モードで実行されたかどうかを示します。

  • 各アセンブリの読み込みのトレース。アセンブリの読み込み元と、読み込まれたバージョンが含まれます。

  • 各モジュールが読み込まれるたびに、そのモジュールに割り当てられた信頼レベル。

  • アプリケーションに関連するすべての構成ファイル。

  • メソッド、型、アセンブリ、およびモジュールを見つけることができなかったエラー。

  • ネイティブ DLL、またはプラットフォーム呼び出しで呼び出される関数を見つけることができなかったエラー。

ローダー ログ ファイルの例を次の表に示します。行番号は目安です。

行番号と説明

ログ エントリ

1 - プロセス

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

2 - プロセス ID

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]

最後の 2 つのエントリ (読み込む側のモジュールと読み込まれる側のモジュール) は、モジュールごとに記録されます。これによって、アセンブリとその位置が識別されます。モジュールの読み込みで発生したエラーは、ローダー ログに記録されます。

エラーの例

このセクションの 2 つの例は、ローダー ログ ファイルを使用して、いつエラーが発生したかを判断する方法を示します。

次の例は、ローダーがアセンブリを見つけることができない場合に書き込まれるログ エントリです。

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 でのパフォーマンスと診断