【问题标题】:How to debug into my nuget package deployed from TeamCity?如何调试从 TeamCity 部署的我的 nuget 包?
【发布时间】:2014-03-18 10:38:06
【问题描述】:

我已将我的团队使用的库放入从 TeamCity 部署到网络文件夹的 nuget 包中。我无法调试到这段代码! SymbolSource 是我读过的一种解决方案,但我更愿意找到某种方法来直接从 TeamCity 访问 .pdb/source 文件。有谁知道怎么做?

编辑。当我在 Nuget Pack 构建步骤中检查 'Include Symbols and Source' 时,除了网络文件夹中的 .nupkg 文件之外,TeamCity 还会创建一个 .Symbol.nupkg。 .Symbol.nupkg 包含 src 和 .pdb 文件。

编辑。我在 TeamCity 上取消选中 'Include Symbols and Source' 并将以下内容添加到我的 nuspec 文件中:

  <files>
    <file src="..\MyLibrary\bin\release\MyLibrary.dll" target="lib\net40" />
    <file src="..\MyLibrary\bin\release\MyLibrary.pdb" target="lib\net40" />
    <file src="..\MyLibrary\*.cs" target="src" />
    <file src="..\MyLibrary\**\*.cs" target="src" />
  </files>

这在 nuget 包中添加了我的库的 dll、pdb 和源文件,并且没有生成我认为只有符号服务器才需要的 .Symbols 文件。

【问题讨论】:

    标签: c# deployment teamcity nuget symbol-server


    【解决方案1】:

    传统方法

    1. 将 pdb 与 dll 放在 NuGet 包中。
    2. 将源代码添加到引用包的解决方案的调试源文件中。

    这意味着您将能够单步执行代码并查看异常,但您可能必须先在磁盘上找到一个文件并打开它,然后才能设置断点。显然,您需要注意源的版本是否正确。

    关于步骤的更多细节

    如果您当前在没有 Nuspec 的情况下打包,则需要创建一个 Nuspec,然后将 pdb 添加到 lib 文件夹中的文件列表“NuGet spec”可能是生成初始规范的有用命令在NuGet docs 中定义。然后确保 Team City Nuget Pack 步骤引用您的新 nuspec。

    关于第 2 步的更多详细信息

    打开解决方案后,右键单击解决方案,选择属性...通用属性...调试源文件,然后添加相关二进制引用的根源目录。或查看MSDN。 请注意,调试时无法打开解决方案属性。

    还没有遇到断点?

    尝试从工具->选项中禁用此功能:


    公共或私人回购的现代方式

    为确保源代码的确切版本可用,请在构建时将其嵌入。

    从 Visual Studio 2017 15.5+ 开始,您可以添加 EmbedAllSources 属性:

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <EmbedAllSources>true</EmbedAllSources>
    

    公共回购的现代方式

    要使您的 nuget 和库大小保持较小,您可以使用 sourcelink package

    它会生成一个 pdb,将调试器定向到来自您的 VCS 提供程序(例如 GitHub、BitBucket)的文件的正确版本。

    【讨论】:

    • 不确定这是否是一个错误,但在 VS2015 中尝试此操作的任何人单击“调试源文件”都不会显示正确的窗口,它似乎显示了配置管理器。
    • @Choco Smith 我有同样的问题。右键解决方案文件,Common Properties->Debug Source Files 显示 VS 2015 中的 Configuration Manager 窗口。你知道 VS2015 中如何显示 Debug Source Files 窗口吗?
    • 在 VS2015 中对我来说一直很好用。我今天在 VS Enterprise 2015 版本 14.0.24720.00 上使用了它。如果它不只是一个流氓扩展弄乱了您的菜单,也许会造成 Microsoft Connect 问题? connect.microsoft.com/VisualStudio/MSNetNative
    【解决方案2】:

    最新版本的 dotPeek(免费!)可以充当符号服务器并即时生成 pdb 文件。这使我能够调试通过 teamcity 提供的 dll。

    在这里下载:

    http://blog.jetbrains.com/dotnet/2014/04/09/introducing-dotpeek-1-2-early-access-program/

    有关如何在此处进行设置的说明。

    https://web.archive.org/web/20160220163146/http://confluence.jetbrains.com/display/NETCOM/dotPeek+Symbol+Server+and+PDB+Generation

    【讨论】:

    • 我希望我能再次投票给你。我今年早些时候来到这里并忘记了这一点,现在我需要做同样的事情。中提琴..你的答案很震撼!
    • 您使用了存档链接。很棒的答案。
    【解决方案3】:

    你当然可以set-up & configure your own symbol server,但这可能是最简单的...

    1. 下载并安装 Inedo 的ProGet
    2. 在目标 Feed 上启用符号服务
    3. 将包从 TeamCity 发布到 ProGet 源
    4. 使用 ProGet 作为您的主要提要来源(因为它可以聚合多个提要,包括 nuget.org)

    所有这些都可以通过 ProGet 的免费版来完成。


    免责声明 -- 我的日常工作是Inedo

    【讨论】:

    • 如果我已经有了 .Symbol.nupkg 文件,为什么还需要一个“符号服务器”? Visual Studio 不能直接读取这个文件吗?
    • @anthonybell 哦,绝对不是! “.symbol.nupkg”文件只不过是一个 zip 文件。 Visual Studio 需要首先找到一个远程 .pdb 文件(通过程序集散列),然后该文件将指向散列的源文件 url。像 ProGet 这样的符号服务器将重新索引 pdb 文件并基于它提供文件。见inedo.com/support/kb/1036/using-progets-symbol-server
    • @anthonybell 根据MS documenation 这应该是可能的,但到目前为止 VS 无法从网络共享或本地文件夹加载符号包。
    • 我不得不修改我的提要的“符号服务器”设置并禁用设置“从从该提要下载的包中去除符号文件”。但是卸载然后重新安装包仍然没有在包中包含 *.pdb 文件。
    • 重启 ProGet 也无济于事,但我运行的是旧版本的 Visual Studio (2012) 和 ProGet (3.8.6)。
    【解决方案4】:

    在你的.nuspec(直接在&lt;package&gt;下):

    <files>
      <file src="bin\$configuration$\$id$.pdb" target="lib\net451\" />
    </files>
    

    (将 net451 更改为您正在编译的平台)

    【讨论】:

      【解决方案5】:

      如果你有包的源代码,那么万无一失(但可能很费力)的方法是:

      1. 将包的源代码添加到您的解决方案中(右键单击解决方案 -> 添加现有项目)
      2. 浏览解决方案中的所有项目并删除对库的 NuGet 引用(即打开每个项目下的 References 文件夹并删除对包的引用。)然后,在您的文件中添加对 NuGet 包项目的引用解决方案。 (即右键单击引用,添加引用,选择项目并勾选项目的框)

      当我想在 NuGet 包中调试的方法被框架而不是我的代码调用时,我不得不这样做,因此我无法进入它。 (在我的例子中,该方法是一个 ASP.NET DelegatingHandler)。

      完成后,您需要通过源代码管理撤消所有更改,以便正确引用 NuGet 包。

      【讨论】:

      • 以上关于符号服务器的选项更好。这种方法每次都容易出错且耗时。设置符号服务器是一次性设置
      • 谢谢。尽管我被否决的答案很费力,但我支持它,因为它允许我在没有源服务器的情况下调试我的代码和 NuGet 包
      • 我不希望团队中的任何人这样做,因为它容易出错且耗时。否决投票,因为我认为这不是处理它的正确方法。我敢肯定,如果有足够多的人同意你的观点,认为这是一种明智的做法,那么他们会投票赞成,我会得到彻底的纠正。
      • 如果你有源代码,你也可以这样做:在使用nuget包的项目的项目属性中,将私有nuget包源代码的bin\debug文件夹添加到参考路径。 (见mariuszrokita.com/…
      • 赞成,因为它不需要购买/安装一些随机产品或服务器,或更改 nuspec,您可能并不总是希望快速查看某些内容。只需正确使用源代码管理即可撤消您的更改。 git co .。完成
      【解决方案6】:

      我找到了一个超级简单的方法来做到这一点,我在这里写过博客:

      https://mattfrear.com/2017/11/29/speed-up-development-in-a-nuget-package-centric-solution/

      这仅在您使用带有&lt;PackageReference&gt; 的新 .NET Core 样式 .csproj(在 .NET Core 或 .NET Framework 上)时才有效。

      这再次假设您可以访问 NuGet 包的源代码。

      1. 在本地计算机上构建和编译 NuGet 包
      2. 将您刚刚编译的 .dll 复制到 本地 NuGet 包源文件夹(在我的机器上,这是C:\Users\matt\.nuget\packages\),覆盖现有的 NuGet 包 .dll。

      就是这样!您应该能够在调试时单步执行该包。不要乱用 .pdbs 或源服务器。这大大加快了我的开发周期。

      【讨论】:

      • 这只适用于新的项目文件格式/ProjectReferences
      • 您的示例位置是 Windows 上的默认全局包位置 (%userprofile%\.nuget\packages)。从那里到 NuGet 3.3+ 中的 dll 的路径是 packagename\version\lib\。那是你复制的地方吗?你是手动复制还是使用nuget add?
      • @jla 是的,你应该看到现有的 dll,要么复制它,要么我重命名原始的,以防你想恢复它。
      【解决方案7】:

      自从这个问题最初发布以来,Jetbrains 已经写了一篇完整的博客文章来介绍如何完成这个问题。步骤可以概括为:

      • 在代理上安装Debugging Tools for Windows
      • 安装并启用Symbol Server plugin
      • 将符号文件索引器构建功能添加到您的构建配置中。
      • 确保 PDB 文件作为人工制品输出。
      • 将 Visual Studio 配置为使用 TeamCity 作为源服务器。

      如果您使用 Nuget 包构建步骤,您可以选中“包含符号和源代码”以输出包含 PDB 的 .symbol.nupkg。根据符号文件索引器是否足够智能以查看此文件,您可能需要更改文件扩展名才能正常工作。

      此处提供了完整的详细信息: https://blog.jetbrains.com/teamcity/2015/02/setting-up-teamcity-as-symbol-and-source-server/

      【讨论】:

        【解决方案8】:

        这是我发现的工作,但可能不需要所有步骤......

        注意:这不允许你同时调试,只能调试 nuget 包或安装它的解决方案。

        1. 以管理员身份运行 Visual Studio
        2. 打开并启动宿主应用程序(您安装 Nuget 包的那个)无需调试 (Ctrl + F5)
        3. 在 Nuget 包解决方案中,确保 Tools &gt; Options &gt; Debugging &gt; General &gt; "Require source files to exactly match the original version"选中。
        4. 确保"Enable just my code"选中
        5. Tools &gt; Options &gt; Debugging &gt; Symbols 中添加一个新文件夹,指向Nuget 包的源目录。 (您按字面意思输入文件夹路径,见下图)
        6. 点击Debug &gt; Attach to Process...
        7. 找到iisexpress(可能有多个,对所有都没有害处)

        【讨论】:

        • @CristianE。 nuget 包可以是类库。上面的说明正是为此。它仍然需要在您安装 nuget 包的主机应用程序(如网站或控制台应用程序)中执行。
        【解决方案9】:

        如果您的代码位于公共 Git 存储库中,或者至少在您的网络中,无需身份验证即可访问,那么 GitLink 将是一个选项:

        https://github.com/GitTools/GitLink

        GitLink 通过将 PDB 更改为指向 Git 服务器来淘汰符号服务器。但是,如前所述,这使得 Git 存储库必须是公开的——直到现在,在访问私有存储库时还没有“正确”的方式来进行身份验证。

        【讨论】:

          【解决方案10】:

          Microsoft 现已在 https://github.com/dotnet/sourcelink/ 集成了 SourceLink NuGet 包,如果 NuGet 包的发布者设置了源代码,则可以在调试时按需下载源代码。

          【讨论】:

            猜你喜欢
            • 2018-01-22
            • 1970-01-01
            • 2015-04-29
            • 2017-11-11
            • 1970-01-01
            • 1970-01-01
            • 2017-08-28
            • 2014-12-21
            • 2011-10-25
            相关资源
            最近更新 更多