如何调试自定义引导程序?

use*_*862 17 windows-installer wix burn wix3.6 votive

我正在使用Burn for MSIs包.我正在使用Votive(Visual Studio)和我自己的自定义BA而不是WiXBA.我尝试使用调试自定义BA Debugger.Launch().但是当我开始调试时,会出现错误消息.

没有为任何调用堆栈帧加载符号.源代码无法显示

我意识到package.exe链接了位于的CustomBA dll C:\Documents and Settings\user\Local Settings\Temp\{GUID}\.{GUID}总是改变.因此,每当我运行package.exe时,总是会更改目录.

我认为这是发生错误的原因.

在Visual Studio中,当我使用CustomBA dll启动package.exe时,它位于绝对路径(.../Debug/bin/CustomBA.dll).但是在执行package.exe之后,它会链接到Local Settings\Temp\{GUID}目录.因此,当我们开始调试并附加到CustomBA dll时,CustomBA dll的目录会动态更改并No symbols are loaded发生错误.

  • 为什么package.exe链接dll位于C:\Documents and Settings\user\Local Settings\Temp\{GUID}\?我们可以静态选择dll的路径吗?
  • 如果我们不能静态选择dll路径,我如何使用CustomBA的调试功能?

Rob*_*ing 26

要调试Bootstrapper应用程序,你需要你的Bundle .wixproj和BA .csproj(或.vcxproj,如果你正在使用本机.dll)在同一个解决方案中,Bundle项目应该依赖于BA项目,所以重建工作正常.以下步骤应该允许您进入代码.

注意:确保运行Visual Studio提升.如果禁用了UAC,请重新启用它.如果Visual Studio运行提升,这些步骤将无法正常工作.

  1. 重建项目.这可以确保您在其中创建了一个包含更新的BA.dll的Bundle.
  2. 右键单击Solution explorer中的BA .csproj并选择Set as StartUp Project.BA .csproj应该是大胆的.
  3. 右键单击BA .csproj并选择Properties.
  4. PropertiesBA .csproj上选择Debug标签.
  5. Debug选项卡中,选择标记的单选按钮Start external program
  6. 浏览到构建Bundle的路径.

现在,您可以按F5并开始调试.请记住,每次更改BA .csproj时,您还需要确保重建Bundle .wixproj.否则,Bundle将与您的旧BA一起启动,调试器将发现新建的BA的.pdbs不匹配.

额外的功劳:如果您Just My Code在调试器设置中禁用并下载pdbs.zip和sources.zip以进行WiX安装的匹配构建,您实际上可以逐步完成刻录代码以及BA,以查看所有内容如何协同工作.

  • 我正在使用你的过程.点击开始时安装程序会启动.但是,虽然我的自定义BA出现了,但我的断点从未被击中.我在VS 2015社区使用Wix 3.10.任何提示都表示赞赏. (5认同)
  • 好奇的是,如果VS正在运行升级,你有兴趣阐述为什么这个过程无法正常工作的原因...... (3认同)
  • Rob,让Wix Projects具有运行/调试功能将是超级压力缓解.故意丢失了吗?正如您所指出的,即使这种解决方法也需要双重构建,以确保您运行您认为正在运行的代码."任何时候你改变BA.csproj"大多数时候你打算在那里进行调试. (2认同)

Ahm*_*dBM 7

我在这篇文章中遵循了Rob的建议,但遗憾的是我无法让它为我工作(Visual Studio 2015,Wix 3.10.3,使用WixWPF管理Bootstrapper应用程序).没有任何断点被击中.我注意到调试器将自己附加到错误的进程,安装程序有两个正在运行的进程(我猜测BA和Bundle).当我改变过程时,断点被击中但我的托管BA有代码我想在调试器实际连接之前进行调试

我设法找到一个解决方案,在连接调试器之前应用程序不会启动.我把这些代码放在我的构造函数代码隐藏文件(在DEBUG块中)中,用于我的托管BA ...

public MainWindow()
{
#if DEBUG
    // Do not start until debugger attached
    while(!System.Diagnostics.Debugger.IsAttached)
    {
        System.Threading.Thread.Sleep(1000);
    }
#endif
    InitializeComponent();
    InstallData = new InstallerInfo();
}
Run Code Online (Sandbox Code Playgroud)

现在,当我编译我的托管Bootstrapper应用程序(带有Debug)和Bundle并运行它时,应用程序将无法启动,直到您连接到托管的Bootstrapper应用程序Tools > Attach to Process > Find your exe in the list.


Ama*_*ein 5

无法从Visual Studio以调试模式运行自定义BA.

您可以做的是运行生成的exe文件,然后将Visual Studio附加到允许您调试它的进程.(在菜单中:Tools > Attach to Process > Find your exe in the list)

  • +1:在关闭 UAC 的情况下为我工作。FWIW,我还在我的 BA 的 `Run()` 开头加入了 `System.Threading.Thread.Sleep(5000);`,以便我有时间附加。 (2认同)
  • 哈哈......"UAC关闭" (2认同)