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

时间:2012-06-12 17:44:51

标签: wix windows-installer wix3.6 burn votive

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

  

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

我意识到package.exe链接位于C:\Documents and Settings\user\Local Settings\Temp\{GUID}\的CustomBA dll。始终更改{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链接位于C:\Documents and Settings\user\Local Settings\Temp\{GUID}\的dll?我们可以选择路径吗? 对于dll静态?
  • 如果我们无法静态选择dll路径,我该如何使用调试 CustomBA的功能?

6 个答案:

答案 0 :(得分:25)

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

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

  1. 重建项目。这可以确保您创建了一个包含更新的BA.dll的Bundle。
  2. 右键单击解决方案资源管理器中的BA .csproj,然后选择Set as StartUp Project。 BA .csproj应该是大胆的。
  3. 右键单击BA .csproj并选择Properties
  4. 在BA .csproj的Properties上选择Debug标签。
  5. Debug标签中,选择标有Start external program
  6. 的单选按钮
  7. 浏览到构建Bundle的路径。
  8. 现在,您可以按F5并开始调试。请记住,每次更改BA .csproj时,您还需要确保重建Bundle .wixproj。否则,Bundle将使用您的旧BA启动,调试器将发现新建的BA .pdbs不匹配。

    额外功劳:如果您在调试器设置中禁用Just My Code并下载pdbs.zip和sources.zip以获得匹配的WiX安装版本,您实际上也可以单步执行刻录代码作为你的学士学位,看看一切如何一起工作。

答案 1 :(得分:6)

我在这篇文章中关注了Rob's suggestion,但遗憾的是我无法让它为我工作(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();
}

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:1)

唯一真正有效的是:

protected override void Run()
{
    Debugger.Launch();
}

在您的引导程序 UI 应用程序(BootstrapperApplication 后代)中。然后从资源管理器启动构建的 bootstrapper.exe 并在“选择即时调试器”窗口中重用 Visual Studio 实例。 在重新构建之前不要忘记清理解决方案。这有时会阻止正确调试。

PS:当无法找到引导程序 UI 程序集的正确 pdb 时,请选择与引导程序设置相同的架构。混合架构可能会导致调试问题。

干杯

答案 4 :(得分:0)

Rob的解决方案不起作用。 AhmedBM的方法有效,但仍可以进一步简化,以便VS运行WiX引导程序进程,然后立即附加到子进程。

public void Run(EnvDTE80.DTE2 DTE, Microsoft.VisualStudio.Shell.Package package)
{
    //kill old ones if any
    System.Diagnostics.Process.Start(@"c:\Windows\System32\taskkill.exe", "/F /IM Bootstrapper.exe /T");
    System.Threading.Thread.Sleep(1000);
    //start new one
    System.Diagnostics.Process.Start(@"<solution path>\src\Bootstrapper\bin\Debug\Bootstrapper.exe");
    System.Threading.Thread.Sleep(1000);

    foreach (Process proc in DTE.Debugger.LocalProcesses)
    {
        if (proc.Name.ToString().Contains(@".cr\Bootstrapper.exe"))
        {           
                proc.Attach();
                return;  
        }
    }
    System.Windows.MessageBox.Show("Bootstrapper Process was not found.");
}

唯一的问题是您需要DTE对象。在VS的早期版本中,我们可以使用Macroses。但是在VS 2017中我们没有它们。因此,您可以快速制作简单的VS扩展,并在其中添加运行代码的命令。或使用现有的扩展名,其中一些允许创建自定义命令。

答案 5 :(得分:0)

与上面建议的许多其他答案一样,调试器附加到运行安装程序可执行文件的进程。您将需要手动将调试器附加到在temp文件夹下生成的UI进程,就像许多以前所做的那样。

要允许子进程自动附加而无需提及所有附加代码,请按照以下说明操作:

  1. 安装名为MicrosoftChildProcessDebuggingPowerTool的Visual Studio扩展程序。
  2. 像Rob提到的那样,在调试开始操作中设置可执行文件。
  3. 启用本机代码调试(重要)
  4. 通过以下方式打开子进程调试 调试->其他调试目标->子进程调试设置->启用子进程调试->保存