1. ホーム
  2. .net

[解決済み] .NET Frameworkのソースステップを有効にする」方法を教えてください。

2022-09-14 05:54:33

質問

2013年2月22日更新 : Microsoft Connect のエントリに、Alok Shriram (Program Manager, Base Class Libraries, .NET Framework) から、この問題が解決されたはずであるというメモがあります。Connect のエントリは次のようにマークされています。 解決済み (修正済み) :

この問題は現在修正されているはずです。参照ソースのアップデートを公開しました。 この問題がまだ修正されていない場合は、私たちにお知らせください。

1年半

ボーナス・リンク

オリジナルの質問

Visual Studio 2010 で .NET フレームワークのソース ステッピングを有効にするにはどうすればよいですか。


ノート : この質問は、より大きな全体の中の1つのピースです。


Visual Studio 2010 には、新しい機能が搭載されています。

  • ツール、オプション、デバッグ、一般。 .NET Framework のソース ステッピングを有効にする

MSDN のページにある説明に従って 方法。.NET Framework ソースのデバッグ :

<ブロッククオート

.NET Framework のソース デバッグを有効にするには

  1. ツール メニューで オプション .

  2. での オプション ダイアログボックスで デバッグ のカテゴリをクリックします。

  3. には 一般的な のボックスで、以下のチェックボックスを選択します。

    • .NET Framework のソース ステッピングを有効にする
    • ソースサーバーのサポートを有効にする

私はこうしています。

注意 : MSDN のページに書いてあるように、そして私が気づいたように、チェックすることで .NET Framework ソース ステッピングを有効にする をチェックすると、自動的に **Enable Just My Code (Managed only) のチェックが外れることに注意してください。また、ソース サーバー サポートの診断メッセージも有効にしました。

これらのオプションを有効にすると、私のためにシンボル キャッシュのダウンロード場所が自動的に設定されました。

注意 : は マイクロソフトシンボルサーバ のエントリはすでに存在しています (そして削除できません)。


MSDN のページには、シンボルを読み込むように書かれています。

モジュールウィンドウを使用してフレームワークのシンボルをロードするには

  1. での モジュール ウィンドウで、シンボルがロードされていないモジュールを右クリックします。シンボルがロードされているかどうかは シンボルの状態 の列を見ればわかります。

  2. を指す。 シンボルの読み込み元 をクリックし マイクロソフトシンボルサーバ をクリックして Microsoft public symbols server からシンボルをダウンロードするか、Symbol Path をクリックして以前にシンボルを保存しておいたディレクトリからロードします。

私はこれを試しています。

と入力すると、すべてのシンボルが読み込まれます。

.NET フレームワークのコードに呼び出されようとしている、ブレークポイントの上に座っています。

protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
{
    base.ScaleControl(factor, specified);

プッシュする F11 を押すと、デバッガは単に次の行にスキップします。

protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
{
    base.ScaleControl(factor, specified);

    //Record the running scale factor used
    this.scaleFactor = new SizeF(
            this.scaleFactor.Width * factor.Width,
            this.scaleFactor.Height * factor.Height);

Visual Studio 2010 で .NET Framework のソース ステッピングを有効にするにはどうすればよいですか。


私は自分のコードのブレークポイントに座っています。コールスタックでさらに上の関数をダブルクリックしてみます。これにより、次のことができるようになると思います。 ジャンプ を .NET コードにジャンプさせることができます。

ただし、これはうまくいきません。Visual Studio は、利用可能なソースがないことを教えてくれます。

Visual Studio 2010 で .NET Framework のソース ステッピングを有効にするにはどうすればよいですか。


.NET コードにステップインしようとする前にディスアセンブル ビューに切り替えると ( デバッグ -> ウィンドウズ -> 分解 ) を見てみると call を.NETのコードに挿入しています。

の逆アセンブルをデバッグすることになります。 System.Windows.Forms.ScaleControl :

<イグ

これは、.NET Framework のソースに踏み込むことができることとは同じではありませんし、同じぐらい便利でもありません。

Visual Studio 2010 で .NET Framework ソースのステップ実行を有効にするにはどうすればよいですか。


私のコンピューターで設定されたシンボルキャッシュのパスには、シンボルキャッシュファイルが含まれています。

ということで、ダウンロードするのは pdb シンボル ファイルをダウンロードしますが、その使用を拒否します。

Visual Studio 2010 で .NET Framework のソース ステッピングを有効にするにはどうすればよいですか。


Leppie は、私がチェックすることを提案しました。 Debug ログを確認するよう Leppie に提案されました (デバッグ ログ ウィンドウを開いた状態で。そうしないと何も記録されません)。

Step into: Stepping over method without symbols 'System.Windows.Forms.Form.ScaleControl'

のシンボルを読み込んでいるのがわかります。 System.Windows.Forms.dll :

Loaded 'C:\Windows\assembly\GAC_MSIL\System.Windows.Forms\2.0.0.0__b77a5c561934e089\System.Windows.Forms.dll', Symbols loaded.

つまり は私のシンボルを見つけましたが、それらを見つけることができなかったと主張しています。

Visual Studio 2010 で .NET Framework のソース ステッピングを有効にするにはどうすればよいですか。


Microsoft イタリアの人が、.NET Framework のソース ステッピングをオフにすることを提案しています。 ソース ファイルが元のバージョンと完全に一致することを要求する :

それでも直らなかった。

Visual Studio 2010 で .NET Framework のソース ステッピングを有効にするにはどうすればよいですか。


のための Microsoft のソース サーバーにバグがあることが示唆されています。 .NET フレームワーク 4.0 . その提案に従って、私はプロジェクトをターゲットとする .NET Framework 3.5 :

それでも直りませんでした。

Visual Studio 2010 で .NET Framework のソース ステッピングを有効にするにはどうすればよいですか。


どこかの誰かが、同じ問題を経験している別の人がいるかどうか、ぼんやりと考えていました。 は 64 ビット版のデバッガーを使っているのだろうか。 . さて、64 ビット版の Visual Studio というものは存在しませんが、私は自分のプロジェクトを AnyCPU から x86 (それは x64 に JIT されていました)、Microsoft が 64-bit プロセッサをサポートしない場合に備えてです。

それでも直りませんでした。

Step into: Stepping over method without symbols 'System.Windows.Forms.Form.ScaleControl'

Visual Studio 2010 で .NET Framework のソース ステッピングを有効にするにはどうすればよいですか。


こちらもご覧ください。

どのように解決するのですか?

ソース コードをステップ スルーするための PDB は、RTM および Service Pack に対してのみ掲載されています。 そのため、セキュリティ アップデートがリリースされ、デバッグしようとしている dll が変更されると、ソース ステップが機能しなくなります (つまり、" No source Available" が表示され、" Browse to find Source" がグレーアウトされます)。

しかし、適切な設定をすべて行った後は、次のような回避策を使用することができます。 この回避策は、基本的に、DLL を変更する原因となったセキュリティ更新プログラムを見つけ、それを削除することです。 これには、あなたのマシン上でそれらのセキュリティ アップデートが削除されるという明らかな欠点があります。

回避策

  1. デバッグする dll を特定する (例: System.Windows.Forms.dll など)
  2. デバッグ中に モジュール ウィンドウを開き バージョン の列を探します。 バージョンが RTM または Service Pack バージョンでない場合、ワークフローを実行する必要があります。 通常、RTM の dll には "ビルド バイと表示されます。RTMRel"と表示されます。 一方、セキュリティ アップデートの一部であるDLLには、「"built by: RTMGDR"と表示されます。 バージョン番号に注意してください (例: 4.0.30319.269 built by: RTMGDR)。
  3. ここで、このバージョンを作成したアップデートを探します。 support.microsoft.com/kb/ で dll とバージョン番号を検索して、これを実行します。 たとえば、私は次のような google 検索を行いました。 site:support.microsoft.com/kb System.Windows.Forms.dll 4.0.30319.269
  4. 検索すると、アップデートに関する情報が表示されるはずです。 アドレス バーにある KB 番号に注意してください。 私の例では、アドレスは http://support.microsoft.com/kb/2604121 であり、KB2604121 が私たちの関心事です。
  5. コントロール パネル] - [プログラムと機能] に移動し、[インストールされた更新プログラムの表示] をクリックします。
  6. KB 番号が記載されている更新プログラムを探します (右上のボックスの検索を使用できます)。
  7. その更新プログラムをアンインストールします。
  8. この同じ dll について、dll が RTMRel バージョンまたは SP バージョンに戻るまで、このプロセスを繰り返します。 たとえば、System.Windows.Forms.dll の場合、RTMRel バージョンに戻る前に KB2686827、KB2604121、KB2518870 を削除する必要がありました。

この作業は、.NET フレームワーク内の、デバッグを必要とする各 dll に対して行う必要があります。

それが完了したら、.net ソース内でブレークポイントを設定するか (たとえば、[ブレークポイント] タブで New->Break at Function と言って System.Windows.Forms.Form.Form と入力します)、その dll の .net メソッドのいずれかに踏み込みます。