カスタム アクションのデバッグ

Windows 用デバッグ ツールを使用すれば、ダイナミック リンク ライブラリに基づくカスタム アクションをデバッグすることができます。 実行可能ファイルまたはスクリプトに基づくカスタム アクションに対して動的デバッグを使用することはできません。

このセクションで説明する手法は、Windows インストーラーのカスタム アクションをデバッグするのに役立ちます。 Windows 用デバッグ ツールの詳細については、Windows ドライバー キット (WDK) の「ドライバー開発ツール」セクションを参照してください。

Windows インストーラーでは、MsiBreak 環境変数を使用して、デバッグするカスタム アクションを決定します。 カスタム アクションのソース コードにアクセスできる場合は、MsiBreak なしでデバッグを使用できる場合があります。 MsiBreak を使用せずにデバッグを開始するには、アクションのコードの先頭に一時的なメッセージ ボックスを配置してください。 インストール中にメッセージ ボックスが表示されたら、メッセージ ボックスを所有するプロセスにデバッガーをアタッチします。 次に、必要なブレークポイントを設定し、メッセージ ボックスを閉じることで、実行を再開できます。 この手法では、カスタム アクションの以前の部分をデバッグすることはできません。

MsiBreak 環境変数を使用してカスタム アクションをデバッグするには、CustomAction テーブル内のカスタム アクションの名前に MsiBreak を設定します。 MsiBreak には、システムまたはユーザーのいずれの環境変数を指定することもできます。 変数がシステム変数として設定されている場合、その値を変更した際には、新しい値を検出できるようにシステムの再起動が必要になることがあります。

MsiBreak 環境変数を使用して埋め込みユーザー インターフェイスをデバッグするには、MsiBreak の値を MsiEmbeddedUI に設定してください。

Windows インストーラーによって MsiBreak 環境変数がチェックされるのは、ユーザーが管理者である場合に限られます。 ユーザーが管理者でない場合は、これがマネージド アプリケーションであっても、インストーラーでは MsiBreak の値を無視します。

実行シーケンスにおいて昇格された (システム) 特権で実行されるカスタム アクションをデバッグする場合は、デバッガーを Windows インストーラー サービスにアタッチします。 実行シーケンスにおいて借用した権限を使用して実行されるカスタム アクションをデバッグすると、デバッグする必要があるプロセスを示すダイアログ ボックスが表示されます。 ユーザーには、どのプロセスをデバッグするかを示すダイアログ ボックスが表示されます。 昇格されたカスタム アクションの詳細については、「カスタム アクション セキュリティ」を参照してください。

デバッガーが正しいプロセスにアタッチされると、インストーラーでは DLL のエントリ ポイントを呼び出す直前にデバッガー ブレークポイントをトリガーします。 ブレークポイントでは、ご利用の DLL は既にプロセスに読み込まれていて、エントリ ポイントのアドレスが決定されています。 カスタム アクション DLL を読み込めなかったか、カスタム アクション エントリ ポイントが存在しなかった場合、ブレークポイントはトリガーされません。 ブレークポイントは DLL 関数を呼び出す前にトリガーされるため、ブレークポイントがトリガーされたら、デバッガーを使用して、カスタム アクション エントリ ポイントが呼び出されるまでステップフォワードする必要があります。 または、カスタム アクションの任意の場所にブレークポイントを設定し、通常の実行を再開することもできます。

Windows インストーラーでは、バイナリ テーブルに格納されていない DLL を、DLL の場所から直接実行します。 このインストーラーでは、バイナリ テーブルに格納されている DLL の元の名前を認識することができず、DLL カスタム アクションを一時ファイル名で実行します。 一時ファイル名の形式は、MSI?????.TMP です。 Windows XP 上では、この一時ファイルはセキュリティで保護された場所 (一般に WindowFolder<\Installer)> に格納されます。

デバッグ用に作成された DLL の多くでは、対応する PDB ファイルの名前とパスが、DLL 自体の一部を成していることに注意してください。 DLL に格納されている場所に PDB が存在するシステム上でこの種類の DLL をデバッグすると、シンボルがデバッガー ツールによって自動的に読み込まれる場合があります。 格納場所で PDB が見つからない場合 (格納場所からのシンボルの読み込みがデバッガーによってサポートされていない場合、またはデバッグ情報を使用して DLL がビルドされていない場合)、一時 DLL ファイルを含むフォルダーにシンボル ファイルを配置することが必要な場合があります。

インストーラーでは、カスタム アクション スクリプトのデバッグ情報をインストール ログ ファイルに追加します。

There is a problem with this Windows Installer package. A script 
required for this install to complete could not be run. Contact your 
support personnel or package vendor.  {Custom action [2] script error 
[3], [4]: [5] Line [6], Column [7], [8] }