4

開発チーム用にローカルの SymbolSource サーバーをセットアップしています。SymbolSource サーバーに書かれた素敵な記事に従いました。ビルドには TeamCity を使用します。各ビルド.symbols.nupkgはコマンドを使用してローカルの SymbolSource にプッシュされnuget push、nuget パッケージはローカルの NuGet サーバーにプッシュされます。

発生している問題:

nuget パッケージ MyPackage.1.1.0 の場合、同じものをシンボル サーバーにプッシュすると、ハッシュが作成され、それが各バージョン フォルダーに関連付けられて.pdbファイルと.csファイルをロードする方法です。(それは私の理解です。間違っている場合は修正してください)。

Visual Studio でシンボル サーバー構成をセットアップした後、プロジェクトのデバッグを試みます。nuget push私たちが経験しているのは、シンボルをロードするために Visual Studio によって生成されたハッシュが、404 で終わるシンボル サーバーでの登録中に生成されたハッシュとは完全に異なることです (フィドラー ステータス コードを含む添付ファイルを参照してください)。 Symbol サーバー上の同じハッシュを使用してフォルダーを手動で作成すると、目的の結果が得られます。つまり、コードにステップインします。

同じバージョンの dll/nuget ファイルに対して 2 つの異なるハッシュがあるのはなぜですか?

2 つの異なる GUID が生成されました フィドラー出力

4

1 に答える 1

2

取得している値はハッシュではなく (ファイル コンテンツのハッシュではないため)、GUIDです。DLL と PDB の各ペアには、ビルド時に GUID が割り当てられます。まったく同じソース コードからビルドされている場合でも、DLL の各ビルドには異なるGUID があります。これは、シンボル サーバーから PDB を取得する唯一の方法は、まったく同じ DLL を使用する場合であることを意味します。完全に異なる GUID を取得しているという事実は、同じ DLL を使用していないことを示しています。したがって、その場合に思いつくことができるシナリオは次のとおりです。

  • シンボル nuget パッケージには、通常の nuget パッケージとは異なる dll があります。両方を同時に生成する場合、これは起こりそうにありませんが、パッケージとバイナリを複数回ビルドする場合は可能です。
  • シンボル サーバーにシンボル パッケージが登録されている nuget パッケージの dll を使用していない
  • 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 とタイムスタンプと比較すると、問題が発生した場所を特定できるはずです。

于 2014-04-15T23:38:56.133 に答える