19

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

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

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

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

在 Visual Studio 中,当我使用位于绝对路径 ( .../Debug/bin/CustomBA.dll) 的 CustomBA dll 启动 package.exe 时。但是在执行 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 的调试功能?
4

7 回答 7

27

要调试引导程序应用程序,您需要在同一解决方案中同时使用 Bundle .wixproj 和 BA .csproj(或 .vcxproj,如果您正在使用本机 .dll),并且 Bundle 项目应该依赖于 BA 项目,因此重新构建正常工作。以下步骤应该允许您单步执行您的代码。

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

  1. 重建项目。这可确保您创建了一个 Bundle,其中包含更新的 BA.dll。
  2. 右键单击解决方案资源管理器中的 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 安装版本,您实际上可以单步调试 Burn 代码以及您的 BA,以了解一切如何协同工作。

于 2013-04-09T22:33:50.193 回答
10

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

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

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();
}

现在,当我与 Bundle 一起编译我的托管引导程序应用程序(带调试)并运行它时,应用程序将不会启动,直到您附加到托管引导程序应用程序Tools > Attach to Process > Find your exe in the list

于 2016-08-10T21:35:25.863 回答
5

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

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

于 2012-06-21T10:10:58.917 回答
1

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

为了允许在不提及所有额外代码的情况下自动附加子进程,您可以如上所述:

  1. 安装名为MicrosoftChildProcessDebuggingPowerTool的 Visual Studio 扩展。
  2. 就像 Rob 提到的那样,在调试启动操作中设置可执行文件。
  3. 启用本机代码调试(重要)
  4. 通过Debug -> Other Debug Targets -> Child Process Debugging Settings -> Enable child process debugging -> Save开启子进程调试
于 2020-09-14T18:26:13.833 回答
1

唯一真正有效的是:

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

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

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

干杯

于 2021-01-22T08:46:06.133 回答
0

将 MessageBox 作为 BA 的第一行。运行 BA,MessageBox 就会出现。在点击 OK 之前,从菜单 DEBUG|Attach to Process,选择您的 BA 和 Attach。然后点击MessageBox的OK。现在你的调试!

于 2021-09-04T07:47:18.143 回答
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 中,我们有可以访问的宏。但是在 VS 2017 中我们没有它们。因此,您可以快速制作简单的 VS 扩展并在其中添加运行代码的命令。或者使用已经存在的扩展,其中一些允许自定义命令。

于 2020-02-04T15:14:41.357 回答