您可以使用適用於 Windows 的偵錯工具來偵錯以 動態連結庫為基礎的自定義動作。 根據 或 文稿,無法使用動態偵錯搭配自定義 動作。
本節所述的技術可協助您偵錯 Windows Installer 自定義動作。 如需 Windows 偵錯工具的相關信息,請參閱 Windows 驅動程式套件 (WDK) 的驅動程式開發工具一節。
Windows Installer 會使用 MsiBreak 環境變數來判斷要偵錯的自定義動作。 如果您有自定義動作原始碼的存取權,則可以在沒有 MsiBreak 的情況下使用偵錯。 若要在沒有 MsiBreak 的情況下開始偵錯,請將暫存消息框放在動作程式代碼的開頭。 安裝期間出現消息框時,請將調試程式附加至擁有消息框的進程。 然後,您可以設定任何必要的斷點,並關閉消息框以繼續執行。 此方法無法偵錯先前部分的自定義動作。
若要使用 MsiBreak 環境變數來偵錯自定義動作,請將 MsiBreak 設定為自訂動作的名稱,CustomAction 資料表中。 MsiBreak 可以是系統或用戶環境變數。 如果變數設定為系統變數,當值變更以偵測新值時,可能需要重新啟動系統。
若要使用 MsiBreak 環境變數來偵錯內嵌的使用者介面,請將 MsiBreak 的值設定為 MsiEmbeddedUI。
如果使用者是系統管理員,Windows Installer 只會檢查 MsiBreak 環境變數。 如果使用者不是系統管理員,則安裝程式會忽略 MsiBreak 的值,即使這是 受控應用程式也一樣。
如果您要對執行順序中具有提升許可權的自定義動作進行偵錯,請將調試程式附加至 Windows Installer 服務。 在執行順序中以模擬許可權執行的自定義動作進行偵錯時,系統會以對話框提示,指出應該偵錯哪個進程。 系統會提示用戶出現對話框,指出要偵錯的進程。 如需提高自訂動作的詳細資訊,請參閱 自定義動作安全性。
調試程式附加至正確的進程之後,安裝程式會立即觸發調試程序斷點,再呼叫 DLL 的進入點。 在程式執行至斷點時,您的 DLL 已載入處理程序,且進入點位址已確定。 如果無法載入您的自定義動作 DLL,或自定義動作進入點不存在,則不會觸發任何斷點。 由於斷點會在呼叫 DLL 函式之前觸發,一旦觸發斷點,您應該使用調試程式向前推進,直到呼叫自定義動作進入點為止。 或者,您可以在自定義動作中的任何位置設定斷點,並繼續正常執行。
Windows Installer 會直接從 DLL 所在位置執行那些未儲存在 Binary 表中的 DLL。 安裝程式不知道儲存在 Binary 數據表中的 DLL 原始名稱,並在暫存檔名下執行 DLL 自定義動作。 暫存檔案名格式為 MSI?????.TMP。 在 Windows XP 上,此暫存盤會儲存在安全的位置,通常 <WindowFolder>\Installer。
請注意,為了偵錯而建立的許多 DLL 都包含對應 PDB 檔案的名稱和路徑,做為 DLL 本身的一部分。 在 PDB 儲存在 DLL 位置的系統上偵錯這種類型的 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] }