参照されたdll(pdbを持つ)をデバッグする方法


132

私のワークスペースには、AとBの2つのソリューションがあります。

ソリューションAは、以前にコーディングを終えた古いプロジェクトです。ソリューションBでは、ソリューションAのいくつかのクラスを使用する必要があります。これを行うには、ソリューションAのプロジェクトの1つのDLLへの参照を追加します。

問題は、デバッグしようとしたときです。私もAのコードに足を踏み入れたいと思っています。Visual Studioはこれらのクラスのコードを読み込むことができず(「現在の場所に使用できるソースコードがありません。」)、逆アセンブリのみを表示できるため、役に立ちません。

ソリューションAからクラスをデバッグする唯一の方法は、ソリューションBを実行し、すべてのプロセスを([デバッグ]メニュー項目で)デタッチし、ソリューションAからプロセスをアタッチすることです。

ただし、これは非常に不便であり、AまたはBを一度にしかデバッグできません。

参照されているdllのコードにステップインできるようにする方法はありますか(ソースコードがあります)?


解決策:私の間違いは、プロジェクトは単一のソリューションの一部にしかならないと思っていたことです。実際、プロジェクトはさまざまなソリューションの一部になることができます。
古いプロジェクトを参照する必要がある場合は、プロジェクトをソリューションに追加するだけです。これは、ソリューションエクスプローラー>追加>既存のプロジェクトで新しいソリューションを右クリックして行います。
その後、プロジェクト参照を追加できます。他の人が書いたように、自分のコード(または、変更とデバッグが必要になる可能性のある他のコード)へのdll参照の使用を完全に回避する必要があります。

ソリューションの設計方法に関する非常に優れたリファレンスは、MSDNにあります。


そのMSDNリンクは.net開発者にとって必読です(彼らが使用するソース管理に関係なく)。まだ見たことがないのには驚きました。ありがとう!
パット

新規参入者、プロジェクト参照について既に知っていて、それがオプションではない場合(たとえば、NuGetパッケージをデバッグする必要がある場合)、受け入れられた回答を無視して、次の回答に直接進んでください:stackoverflow.com/a/26029208/398630
BrainSlugs83

回答:


113

プロジェクト参照があれば、すぐに機能するはずです。

それがある場合は、ファイル(DLL)を参照、あなたはデバッグシンボル(「PDB」ファイル)は、DLLと同じフォルダにする必要があります。プロジェクトがデバッグシンボルを生成していることを確認します(プロジェクトプロパティ=>ビルド=>詳細=>出力/デバッグ情報=フル); dll をコピーした場合は、pdbも一緒に配置します。

ファイルをコピーしたくない場合は、シンボルをIDEに直接ロードすることもできますが、作業が面倒です。

最も簡単なオプションは、プロジェクト参照を使用することです!


3
残念ながら、別のソリューションからプロジェクトへのプロジェクト参照を追加することはできないと思います(間違っている場合は修正してください)。
Elad、

7
@エラッド私はちょうどこれをやった。最初に「既存のプロジェクト」をソリューションに追加します。次に、[プロジェクト参照の追加]をクリックして、プロジェクトへの参照を追加します。既存のプロジェクトファイルにブレークポイントを設定できます。ファイルがコピーされないので、これは素晴らしいです。
user420667

3
DLLプロジェクトをプロジェクト参照として持っていますが、内部のブレークポイントは無視されます。
スラブ

1
私は実際に、ファイル参照として追加された(リリース)アセンブリを今日デバッグすることができました。私にとっては良いことですが、それはどうして起こりましたか?MSVC2010、C#、(ASP).NET 4.0、参照されるアセンブリは、debug + releaseとして存在します(ただし、プロジェクトに追加されるのはリリースファイルのみです)。これを明確にしたいと思います。
Tobias81

1
私にとっては、ある日は機能していましたが、翌日は機能しませんでした(DLLとPDBファイルがあるため)。ただし、[ツール]> [オプション]> [デバッグ]> [シンボル]の[シンボルキャッシュを空にする]ボタンを押すと修正されました。
ポール

45

同じ問題がありました。彼は私が見つけたものです:

1)すべてのプロジェクトが同じフレームワークを使用していることを確認してください(これは重要です!)

2)[ツール/オプション]> [デバッグ]> [全般]で、[コードのみを有効にする(管理対象のみ)]がチェックされていないことを確認します

3)[ツール]> [オプション]> [デバッグ]> [シンボル]で、キャッシュされたシンボルをすべてクリアし、「シンボルファイル(.pdb)の場所」リストボックスの下のデフォルトの「Microsoftシンボルサーバー」以外のすべてのフォルダの場所を選択解除して削除します。また、[このディレクトリのシンボルをキャッシュする]テキストボックスの静的パスをすべて削除します。「シンボルキャッシュを空にする」ボタンをクリックします。最後に、「指定されたモジュールのみ」ラジオボタンがチェックされていることを確認してください。

4)すべてのプロジェクトの[ビルド/構成マネージャー]メニューで、構成がデバッグモードであることを確認します。


3
私の問題は、私の2つのプロジェクトが異なる.Net Frameworks 4.0と4.5を使用していたことでした。Tx!
user627283

1)と4)は非常に重要です。デバッグモードでビルドし、同じフレームワークを使用することを忘れないでください。
scott_f 2018年

12

留意すべきもう1つのポイントは、参照されているdllがGACにインストールされていないことを確認してください。テスト後、システムレベルのテストを行うために、dllをGACにインストールしました。その後、コードを再度デバッグする必要が生じたときに、GACからそれらを削除するまで、参照されたアセンブリにステップインできませんでした。


2
ありがとうございました!これは私の問題でした。これが理解できなかったなんて信じられません:-/プロジェクト参照を設定すると、GACにインストールされているものをどうにか上書きすることになると思いました。
SnookerC 2015

絶対に!これは非常に良い点です。同じバージョンの.NET Frameworkを使用している場合でも、GACにコードがある場合、GACの.PDBファイルがプロジェクトフォルダーの.PDBファイルと異なる場合、デバッグしようとしたときにブレークポイントにヒットしません。これに対する解決策は、DLLをGAC解除し、ビルドし、アセンブリをGACすることです。
DigiOzマルチメディア2017

7

ステップ1:[ツール]-> [オプション]-> [デバッグ]に移動します

手順2: [コードのみを有効にする]チェックボックスをオフにします

ステップ3:元のバージョンと完全に一致するソースファイルを要求するのチェックを外します

ステップ4:プロパティと演算子のステップをオフにする


3

私が持っていた*.pdb同じフォルダにファイルをしてからオプションを使用Arindam、それはまだ動作しませんでした。[プロジェクトのプロパティ]> [デバッグ]にある[ ネイティブコードのデバッグ有効にする]を有効にする必要があることがわかりました。


1
この情報は、受け入れられた回答に含まれているはずです。特に私が探していたもの。共有してくれてありがとう!+1
Heriberto Lugo

2

参照先のdllのソースコードにブレークポイントを設定する場合は、まず、使用可能なpdbファイルがあることを確認してください。次に、関連するソースコードファイルを開き、そこにブレークポイントを設定します。ソースファイルは、ソリューションの一部である必要はありません。Visual Studioで参照されているコードにブレークポイントを設定するにどうすればよいですか?

デバッグ->ウィンドウ->ブレークポイントから利用できるブレークポイントウィンドウでブレークポイントを確認できます。

このアプローチには、デバッグのために既存のプロジェクトをソリューションに追加する必要がないという利点があります。これを省略すると、ビルド時間を大幅に節約できます。明らかに、プロジェクトが1つだけのソリューションを構築する方が、多数のプロジェクトを含むソリューションを構築するよりもはるかに高速です。


1
これは、ブレークポイントを配置した外部ファイルがPDBの正確なパスと一致する場合にのみ機能します。(たとえば、DLLをマシン上に構築した場合にのみ機能します。)
Josh M.

2

DLLがGACに登録されていないことを確認してください。Visual StudioはGACのバージョンを使用し、おそらくデバッグ情報を持ちません。


1

一部のソリューションに外部クラスライブラリプロジェクトを含めたくないので、別の方法で使用するアセンブリにステップインします。

私のソリューションには、他のプロジェクトからの自分のDLLを含む「Common Assemblies」ディレクトリがあります。私が参照しているDLLにも、デバッグ用のPDBファイルが付属しています。

デバッグしてブレークポイントを設定するには、使用しているアプリケーションのソースにブレークポイントを設定し、アセンブリからメソッドまたはコンストラクターを呼び出してから、メソッド/コンストラクター呼び出しをINTO(F11)します。

デバッガーはVSにアセンブリのソースファイルを読み込み、アセンブリ内の新しいブレークポイントをそのポイントに設定できます。

これは簡単なことではありませんが、新しいプロジェクト参照を含めたくないが、代わりに共有アセンブリを参照したい場合に機能します。


0

うまくいくはずです。以前は.exeファイルとdllを同時にデバッグしていました。私が提案するのは、1)Bプロジェクトにdllのパスを含める、2)次に、Aプロジェクトをデバッグでコンパイルする、3)パスがA dllおよびde pdbファイルを指すように制御する... 4)その後、 Bプロジェクトのデバッグを開始し、問題がなければ、両方のプロジェクトでデバッグできます。


0

Visual Studio 2019を使用して、NuGetで参照している外部ライブラリをデバッグする最も簡単な方法は、次の手順を実行することです。

  1. 「ツール」>「オプション」>「デバッグ」>「一般」>「コードのみを有効にする」のチェックを外します

  2. アセンブリエクスプローラー> NuGetパッケージキャッシュから開くに移動します。 リストアイテム

  3. デバッグするNuGetパッケージ名を検索フィールドに入力し、[OK]をクリックします ここに画像の説明を入力してください

  4. アセンブリエクスプローラーから、インポートされたアセンブリを右クリックし、[Generate Pdb]を選択します。 ここに画像の説明を入力してください

  5. .PDBファイルを保存するカスタムパスと、これを生成するフレームワークを選択します

    ここに画像の説明を入力してください

  6. 生成されたフォルダーから.PDBファイルをデバッグフォルダーにコピーすると、このアセンブリのライブラリコードにブレークポイントを設定できるようになります


アセンブリエクスプローラーが見つからないことを除いて、いいですね。Resharperのこの部分ではないですか?
ロバートマッサ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.