如何调试从TeamCity部署的nuget包?


69

我已经将团队使用的库放入nuget包中,该包从TeamCity部署到网络文件夹中。我无法调试此代码!SymbolSource是我已了解的一种解决方案,但我宁愿找到某种方法直接从TeamCity访问.pdb / source文件。有谁知道如何做到这一点?

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

编辑。 我取消选中'Include Symbols and Source'TeamCity,并在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文件,我认为这仅对符号服务器有用。

Answers:


73

传统方法

  1. 将pdb与dll一起放入NuGet包中。
  2. 将源代码添加到“调试源文件”中,以获取引用该程序包的解决方案。

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

详细步骤

如果您目前的包装没有Nuspec,你需要创建一个Nuspec,PDB应该添加到lib文件夹中的文件列表“的NuGet规范”可能是产生在定义的初始规范中的一个有用的命令的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软件包

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


9
不知道这是否是一个错误,但是在VS2015中尝试单击“调试源文件”的任何人都没有显示正确的窗口,似乎显示了配置管理器。
Choco Smith

@Choco Smith我也有同样的问题。右键单击解决方案文件,“公共属性”->“调试源文件”在VS 2015中显示“配置管理器”窗口。您知道如何在VS2015中显示“调试源文件”窗口吗?
honzakuzel1989

在VS2015中对我来说一直很好。我今天在VS Enterprise 2015版本14.0.24720.00上使用了此功能。如果这不仅是使您的菜单混乱的恶意扩展,还是可能会引起Microsoft Connect问题?connect.microsoft.com/VisualStudio/MSNetNative
Graham

29

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


我希望我能再次投票给你。.我今年早些时候来到这里,忘记了这一点,现在我需要这样做。中提琴..您的回答很艰难!
Piotr Kula

您使用了存档链接。很棒的答案。
Martin Dawson

8

您当然可以设置和配置自己的符号服务器,但这可能是最简单的...

  1. 下载并安装Inedo的ProGet
  2. 启用在目标Feed上投放的交易品种
  3. 将软件包从TeamCity发布到ProGet feed
  4. 使用ProGet作为主要供稿源(因为它可以聚合多个供稿,包括nuget.org)

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


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


如果我已经有.Symbol.nupkg文件,为什么还需要一个“符号服务器”?Visual Studio不能直接读取此文件吗?
anthonybell

1
@anthonybell哦,绝对不是!“ .symbol.nupkg”文件不过是一个zip文件。Visual Studio首先需要找到一个远程.pdb文件(通过程序集哈希),然后该文件将指向一个哈希的源文件url。像ProGet这样的符号服务器将重新索引pdb文件并基于该文件提供文件。参见inedo.com/support/kb/1036/using-progets-symbol-server
Karl Harnagy 2014年

根据MS文档,@ anthonybell应该可以,但是到目前为止VS无法从网络共享或本地文件夹中加载符号包。
Markus L

我必须修改供稿的“符号服务器”设置,并禁用“从此供稿下载的软件包中的带符号文件”设置。但是,卸载然后重新安装该软件包仍未在软件包中包含* .pdb文件。
肯尼·埃维特

重新启动ProGet也无济于事,但是我正在运行旧版本的Visual Studio(2012)和ProGet(3.8.6)。
肯尼·埃维特

6

在您.nuspec(位于的正下方<package>):

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

(更改net451为要编译的平台)


3

我找到了一种超级简单的方法来进行此操作,我已经在这里写过博客:

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

仅当您使用新的.NET Core样式.csproj <PackageReference>(在.NET Core或.NET Framework上)时,此方法才有效。

再次假设您有权访问NuGet包的源代码。

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

而已!您应该能够在调试时进入该程序包。不会弄乱.pdbs或源服务器。这极大地加快了我的开发周期。


这仅适用于新的项目文件格式/ ProjectReferences

您的示例位置是Windows上的默认全局软件包位置(%userprofile%\。nuget \ packages)。从那里到NuGet 3.3+中dll的路径是packagename \ version \ lib \。那是您要复制的地方吗?您是手动复制还是使用nuget add?
jla

@jla是的,您应该看到现有的dll,可以在该dll上进行复制,也可以重命名原始的dll,以防您要还原它。
马特·弗雷尔

2

自从最初发布此问题以来,Jetbrains就如何完成此问题撰写了整个博客文章。这些步骤可以概括为:

  • 在代理上安装Windows调试工具
  • 安装并启用Symbol Server插件
  • 将Symbol Files Indexer构建功能添加到您的构建配置中。
  • 确保将PDB文件作为人工输出。
  • 将Visual Studio配置为使用TeamCity作为源服务器。

如果您使用的是Nuget Package构建步骤,则可以选中“包括符号和源代码”以输出.symbol.nupkg包含PDB的。根据符号文件索引器是否足够聪明而无法在该文件内部查找,您可能需要更改文件扩展名才能正常工作。

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


2

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

注意:这不允许您同时调试nuget软件包或安装了它的解决方案。

  1. 以管理员身份运行Visual Studio
  2. 无需调试即可打开并启动主机应用程序(安装了Nuget软件包的主机应用程序)(Ctrl + F5)
  3. 在NuGet包解决方案,确保Tools > Options > Debugging > General > "Require source files to exactly match the original version"检查。
  4. 确保"Enable just my code"检查
  5. Tools > Options > Debugging > Symbols指向Nuget包的源目录的位置添加一个新文件夹。(您实际上输入了文件夹路径,请参见下图)
  6. 请点击 Debug > Attach to Process...
  7. 查找iisexpress(可能有多个,对所有对象都没有任何伤害)

符号源位置的屏幕截图


@CristianE。nuget包可以是类库。上面的说明正是针对这一点。它仍然需要在安装nuget软件包的主机应用程序(如网站或控制台应用程序)中执行。
hofnarwillie

2

如果您拥有该软件包的源代码,那么万无一失(但可能会很费力)的方法是:

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

当我想在NuGet包中调试的方法是由框架而不是由我的代码调用时,我必须这样做,因此我无法介入。(就我而言,该方法是ASP.NET DelegatingHandler)。

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


上面有关符号服务器的选项更好。这种方法容易出错,并且每次都很费时间。设置符号服务器是一次性的设置
hofnarwillie 2016年

@hofnarwillie如果使用符号服务器,是否可以在NuGet软件包的源代码内设置断点?还是只能在自己的代码中设置一个断点,然后进入NuGet包的源代码?
马特·弗雷尔

两者都可以做,但是,我实际上发现您甚至不需要运行符号服务器(但是在这种情况下,您一次只能调试一个)。请参阅我的答案以获取更多详细信息。stackoverflow.com/a/38578379/883644
hofnarwillie '16

3
我不希望团队中的任何人这样做,因为它容易出错并且很耗时。投反对票是因为我认为这不是正确的处理方式。我敢肯定,如果有足够的人同意您的看法,这是明智的做法,那么他们会投票赞成,我将得到彻底纠正。
hofnarwillie '16

1
如果您有源代码,也可以这样做:在使用nuget包的项目的项目属性中,将私有nuget包源代码的bin \ debug文件夹添加到参考路径。(见mariuszrokita.com/...
MBWise

0

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

https://github.com/GitTools/GitLink

通过更改PDB使其指向Git服务器,GitLink使符号服务器过时了。但是,如前所述,这使得Git存储库必须是公共的-到目前为止,访问私有存储库时没有“正确”的身份验证方法。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.