调试自定义操作

可以使用 Windows 调试工具调试基于动态链接库的自定义操作。 无法对基于可执行文件脚本的自定义操作使用动态调试。

本部分所述的方法可帮助你调试 Windows Installer 自定义操作。 有关 Windows 调试工具的信息,请参阅 Windows 驱动程序工具包 (WDK) 的“驱动程序开发工具”部分。

Windows Installer 使用 MsiBreak 环境变量来确定要调试哪个自定义操作。 如果你有权访问自定义操作的源代码,则可以在没有 MsiBreak 的情况下使用调试。 若要在没有 MsiBreak 的情况下开始调试,请在操作代码的开头放置一个临时消息框。 当安装过程中出现消息框时,将调试器附加到拥有该消息框的进程。 然后可以设置任何所需的断点,并关闭消息框以恢复执行。 无法通过此方法调试自定义操作的较前面部分。

若要使用 MsiBreak 环境变量调试自定义操作,请在 CustomAction 表中将 MsiBreak 设置为自定义操作的名称。 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 本身的一部分。 在可以在 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] }