【问题标题】:Cannot find Symbol Source code when debugging Nuget package调试 Nuget 包时找不到符号源代码
【发布时间】:2019-01-27 16:24:06
【问题描述】:

我有一个构建内部 Nuget 包的构建服务器。当我使用那个包并尝试进入一个不起作用的方法时。

所有符号都发布到我的符号服务器,我已在我的 VS 设置中启用此功能。

如果我检查“模块”窗口,我会看到 Nuget DLL 在那里,并且从符号服务器加载了正确的符号。

但是,当我尝试单步执行代码时,它会直接跳过方法。如果我使用调用堆栈专门查看该代码行,它会显示“找不到 ClientBase.cs”。如果我展开“来源搜索信息”,我会看到:

查找 'C:\Build 的源 代理\vsts-agent-win7-x64-2.117.1_work\1\s\ClientsShared\Class\ClientBase.cs'。 (没有校验和。)

文件'C:\Build 代理\vsts-agent-win7-x64-2.117.1_work\1\s\ClientsShared\Class\ClientBase.cs' 不存在。

在脚本文档中查找 'C:\Build 代理\vsts-agent-win7-x64-2.117.1_work\1\s\ClientsShared\Class\ClientBase.cs'...

在项目中寻找 'C:\Build 代理\vsts-agent-win7-x64-2.117.1_work\1\s\ClientsShared\Class\ClientBase.cs'。

在项目中找不到该文件。

使用源查找源 服务器...

活动解决方案的调试源文件设置 表示调试器不会要求用户查找文件: C:\构建 代理\vsts-agent-win7-x64-2.117.1_work\1\s\ClientsShared\Class\ClientBase.cs.

调试器找不到源文件 'C:\Build 代理\vsts-agent-win7-x64-2.117.1_work\1\s\ClientsShared\Class\ClientBase.cs'。

为什么要在 Build Agent 上寻找源代码?这不应该存储在符号服务器上的 PDB 中吗?

【问题讨论】:

    标签: c# nuget symbols symbol-server


    【解决方案1】:

    可能发生的情况是您添加到 NuGet 包的 PDB 文件不是索引文件。它是由 MSBuild 构建的原始文件。

    您在使用 TeamCity 吗?您只有一种构建配置吗?如果是这样,那肯定是这样。

    TeamCity 为作为工件创建的任何 PDB 文件编制索引(假设您已安装 plugin)。这里有一个问题:索引您的 PDB 意味着修改您的 PDB。修改后的 PDB 将在构建工件中找到。由于在构建过程中修改后的(索引的)PDB 可用,因此您必须将其拆分为两个配置。

    构建配置

    创建一个名为 Build 的构建配置并编辑配置设置。查看常规设置。 Artifact Paths 列出了将从您的构建中输出的文件。

    此文本框列出了一系列规则:将匹配 this 模式的文件复制到 that 路径的工件。您想添加规则以使用正确的相对结构将 dll、pdb、sln、csproj、nuspec 和 packages.config 文件复制到工件。你应该得到这样的结果:

    MyProject.sln
    MyProject/bin/Release/MyProject.pdb => MyProject/bin/Release
    MyProject/bin/Release/MyProject.dll => MyProject/bin/Release
    MyProject/MyProject.csproj => MyProject
    MyProject/MyProject.nuspec => MyProject
    MyProject/packages.config => MyProject
    

    运行此构建并验证您是否获得了预期的工件。检查构建日志并确保它包括“索引符号源”和“发布符号源”步骤。然后点击构建成功的 Artifacts 选项卡,这六个文件应该会列出来,并且在正确的目录结构中。

    NuGet 配置

    由于 TeamCity 在索引 PDB 时会修改您的 PDB,因此您无法在构建配置中生成 NuGet 包。您需要第二个配置。我们称之为“NuGet”。

    创建一个名为 NuGet 的新构建配置并编辑配置设置。查看 Dependencies,并添加一个新的 Artifact Dependency。这应该取决于构建配置并从上次成功构建中获取工件。引入我们从构建配置中输出的所有文件:

    **/*
    

    创建一个名为“NuGet Install”的构建步骤。这应该是恢复所有依赖项的“NuGet 安装”步骤。输入 *.sln 文件的名称。

    创建名为“NuGet Pack”的第二个构建步骤。这应该是“NuGet Pack”步骤。规范文件实际上是您的 csproj,而不是您的 nuspec!只需给出完整路径,例如 MyProject/MyProject.csproj。将输出目录设置为“Packages”并选中“Publish created packages to build artifacts”。

    NuGet 规范

    要完成图片,您需要确保 *.nuspec 文件包含 PDB 文件。您可以通过将 DLL 和 PDB 列为 *.nuspec 中的文件来完成此操作。在下面添加一个部分(不在其中)并列出这两个文件。它应该看起来像这样:

    <?xml version="1.0"?>
    <package >
      <metadata>
        <id>$id$</id>
        <version>$version$</version>
        <title>$title$</title>
        <authors>$author$</authors>
        <owners>$author$</owners>
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <description>$description$</description>
        <copyright>Copyright 2018</copyright>
      </metadata>
      <files>
        <file src="bin\Release\MyProject.dll" target="lib\net461" />
        <file src="bin\Release\MyProject.pdb" target="lib\net461" />
      </files>
    </package>
    

    【讨论】:

    • 嗨迈克尔,感谢您的深入回答。我们使用 VSTS 来构建我们的人工制品,但您可能对 PDB 正在修改有意见。我会考虑到这一点进行调查。
    猜你喜欢
    • 2013-06-15
    • 2014-01-15
    • 1970-01-01
    • 2019-09-08
    • 2021-06-10
    • 1970-01-01
    • 2021-04-19
    • 2015-11-05
    • 2012-12-13
    相关资源
    最近更新 更多