【问题标题】:SymbolSource Server IssueSymbolSource 服务器问题
【发布时间】:2014-04-15 23:03:16
【问题描述】:

我们正在为我们的开发团队设置本地 SymbolSource 服务器。我们关注了a nice article written on SymbolSource server。我们使用 TeamCity 进行构建。对于每个构建,使用nuget push 命令将.symbols.nupkg 推送到本地SymbolSource,并将nuget 包推送到本地NuGet 服务器。

我们遇到的问题:

对于 nuget 包 MyPackage.1.1.0,如果我们将其推送到符号服务器,它会创建哈希,这就是它为每个版本文件夹关联以加载 .pdb 文件和 .cs 文件的方式。 (这是我的理解。如果我错了,请纠正我)。

在 Visual Studio 中设置符号服务器配置后,我们尝试调试项目。我们遇到的是,Visual Studio 为加载符号而生成的哈希与在符号服务器上使用 nuget push 注册时生成的哈希完全不同,最终为 404。(请参阅带有提琴手状态代码的附件。)如果我们在符号服务器上手动创建一个具有相同哈希值的文件夹,我们得到所需的结果,即进入代码。

为什么相同版本的 dll/nuget 文件有两个不同的哈希值?

【问题讨论】:

    标签: .net debugging windbg symbol-server


    【解决方案1】:

    您获得的值不是哈希值(因为它们不是文件内容哈希值),它们是GUIDs。每个 DLL - PDB 对在构建时都分配有一个 GUID。 DLL 的每个构建 都有一个不同 GUID,即使它们是从完全相同的源代码构建的!这意味着您从符号服务器获取 PDB 的唯一方法是使用完全相同的 DLL。您获得完全不同的 GUID 的事实向我表明您没有使用相同的 DLL。所以在这种情况下我可以想出的场景是:

    • 符号 nuget 包的 dll 与普通 nuget 包不同。如果您同时生成两者,这似乎不太可能,但是如果您多次构建包和二进制文件,这是可能的。
    • 您没有使用 nuget 包中的 dll,该 nuget 包的符号包已在您的符号服务器中注册
    • 您根本没有使用 nuget 包中的 dll

    您的“修复”工作的原因是因为 Visual Studio 显然只使用 GUID 来创建符号搜索路径,但在加载 PDB GUID 时不检查它。换句话说,它(相当)假设符号服务器将符号放置在正确的位置。

    解决问题的最佳方法是找出您从何处获取不同的 DLL。您可以使用dumpbin 实用程序来找出哪个PDB 链接到哪个DLL 通过使用

    dumpbin.exe /headers mypackage.dll
    

    这应该会产生一个输出,其中包含 PDB 文件的路径和(!)链接 DLL 和 PDB 的 GUID。如果您将计算机上 DLL 的 GUID 和时间戳与符号服务器上的 DLL / PDB 中的 GUID 和时间戳进行比较,您应该能够找出问题所在。

    【讨论】:

    • 这不是 GUID,而是时间戳。您可以使用 .formats <timestamp> 在 WinDbg 中将时间戳转换为日期时间值,例如.formats 5011B05E 将输出Thu Jul 26 23:02:22 2012
    • 也许我错了。似乎他们有一个 GUID 一个时间戳。
    • 哇!!如此详细的答案,甚至我都没有放图像。感谢您花时间让我走上正确的道路。感谢托马斯阅读我的问题并尝试帮助我!我查看了详细信息,发现两个 dll 都生成了不同的 guid。它现在让我的问题变得更有趣了“为什么会有这样的行为?”。我会尝试可能的选择,如果我没有得出结论,我会询问社区。再次感谢!!
    • @ThomasW。我记得,时间戳签名最初用于识别二进制文件。然而,这有很多缺点并且不能很好地扩展。解决方法是使用 GUID,这是现在的主要选项。
    猜你喜欢
    • 2010-12-25
    • 2015-05-16
    • 2014-07-22
    • 2016-12-12
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    相关资源
    最近更新 更多