Visual Studio のデバッグ/読み込みが非常に遅い 質問する

Visual Studio のデバッグ/読み込みが非常に遅い 質問する

もう途方に暮れています。Visual Studio は、通常、 ASP.NET MVC サイトのデバッグや単純な読み込み (「デバッグなしで開始」) に非常に時間がかかります。常にそうとは限りません。最初はプロジェクトは問題なく高速に読み込まれますが、一度読み込みが遅くなると、その後は常に読み込みが遅くなります。1 ~ 2 分以上待つこともあります。

私の設定:

私は使用していますVisual Studio 2012 エクスプレス、現在は、Visual Studio 2010 Express でも同じ問題が発生しています。私のソリューションはネットワーク ドライブに保存されています。具体的には、マイ ドキュメントがネットワーク ドライブにリダイレクトされます (重要ではありません)。(重要ではありません。この設定では、サイトが非常に速く読み込まれることがあります。)

通常は Internet Explorer 9 で読み込みますが、Firefox でも同じ問題が発生します。

これは私が取り組んでいるどの ASP.NET MVC プロジェクトでも発生する可能性があり、私のすべての ASP.NET MVC プロジェクトで実行されている DisplayTemplates を中心に発生するようです。そして、それが問題であるなら、それはすべて C# と Razor です。

症状:

システムはシンボルを何百回も読み込みます。基本的には次のようになりますが、少なくとも 300 行あり、それぞれに同じ CSHTML のわずかに異なる DLL ファイルがあります。

'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_contact.cshtml.22013bb9.xighmhow.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_contact.cshtml.22013bb9.cv5hktkf.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_statuscode.cshtml.22013bb9.1o77hs8i.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_statuscode.cshtml.22013bb9.jja-77mw.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_location.cshtml.22013bb9.l_e9ev_s.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_location.cshtml.22013bb9.b4n59gom.dll', Symbols loaded.

上記には、「Contact」、「Location」、および「StatusCode」という 3 つの DisplayTemplates があります。IIS は、表示テンプレートが呼び出されるたびにシンボルを 2 回ロードしているようです。したがって、これら 3 つの表示テンプレートすべてを呼び出す 100 個のエントリのテーブルを表示する場合、600 個の個別のシンボルがロードされます。

これも高速な操作ではありません。IIS が生成するログ ファイルは、各シンボルの読み込みに約 200 ミリ秒かかります。つまり、非常に長い遅延が発生します。

私が試したこと:

  • デバッグバージョンでもリリースバージョンでも問題ありません。
  • 私のプロジェクトを Web サーバー上の完全な IIS 実装に配置すると、問題なく超高速で実行されます。
  • Cassini、IIS Express 7.5、IIS Express 8.0 のすべてにこの問題が発生しています。
  • すべてのブレークポイントを削除しても何も起こりません。
  • Clean Solution、または .suo を削除しても何も起こりません。
  • IIS Express を修復/My Docs\IISExpressフォルダーを削除するか、Visual Studio を修復/再インストールすると、問題は解消される可能性がありますが、しばらくするとすぐに再発します。

どのようなアドバイスでも大歓迎です。

さらに質問にお答えすると、はい、私のマシンには間違いなく処理能力があります。腹立たしいことに、何も変更していない同じプロジェクトでも、IIS Express を修復してフォルダーを削除した後は、非常に速く読み込まれることがありますMy Docs\IISExpress。最終的には、「何か」が起こり、再度読み込むのに 2 分しかかかりません。私が取り組んでいるのは複雑なプロジェクトではありません。外部ライブラリや依存関係はなく、VS.NET にはアドオンは一切ありません。

注目すべきは、このマシンには、過去に大混乱を引き起こしたことがある Symantec Endpoint Protection が搭載されていることです。しかし、これを完全に無効にしても (管理者であることは良いことです)、問題は解決しませんでした。

この時点で、私はある仮説を立てました。これはすべて、ネットワーク共有からリダイレクトされたフォルダーで作業しているためだと考えています。デバッガーが何百もの「ロードされたシンボル」行を調べている間に、私は一時停止して、それが何をしているのかを確認しました。それは私のコード内で、私が持っていた DisplayTemplate をロードしていました。テンプレートにステップインすると、次の出力が表示されます。

Step into: Stepping over non-user code 'System.Threading.WaitHandle.InternalWaitOne'
Step into: Stepping over non-user code 'System.Threading.WaitHandle.WaitOne'
Step into: Stepping over non-user code 'System.CodeDom.Compiler.Executor.ExecWaitWithCaptureUnimpersonated'
Step into: Stepping over non-user code 'System.CodeDom.Compiler.Executor.ExecWaitWithCapture'
Step into: Stepping over non-user code 'Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch'
Step into: Stepping over non-user code 'Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromFileBatch'
Step into: Stepping over non-user code 'System.Web.Compilation.AssemblyBuilder.Compile'
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_statuscode.cshtml.22013bb9.bciuyg14.dll', Symbols loaded.
Step into: Stepping over non-user code 'System.Web.Compilation.BuildManager.CompileWebFile'
Step into: Stepping over non-user code 'System.Web.Compilation.BuildManager.GetVPathBuildResultInternal'
Step into: Stepping over non-user code 'System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert'
Step into: Stepping over non-user code 'System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory'
Step into: Stepping over non-user code 'System.Web.Mvc.BuildManagerWrapper.System.Web.Mvc.IBuildManager.FileExists'
Step into: Stepping over non-user code 'System.Web.Mvc.VirtualPathProviderViewEngine.GetPathFromGeneralName'
Step into: Stepping over non-user code 'System.Web.Mvc.VirtualPathProviderViewEngine.FindPartialView'
Step into: Stepping over non-user code 'System.Web.Mvc.ViewEngineCollection.Find'
Step into: Stepping over non-user code 'System.Web.Mvc.ViewEngineCollection.FindPartialView'
Step into: Stepping over non-user code 'System.Web.Mvc.Html.TemplateHelpers.ActionCacheViewItem.Execute'
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_statuscode.cshtml.22013bb9.kwj3uqan.dll', Symbols loaded.
Step into: Stepping over non-user code 'System.RuntimeType.CreateInstanceSlow'
Step into: Stepping over non-user code 'System.Web.Mvc.DependencyResolver.DefaultDependencyResolver.GetService'
Step into: Stepping over non-user code 'System.Web.Mvc.BuildManagerViewEngine.DefaultViewPageActivator.Create'
Step into: Stepping over non-user code 'System.Web.Mvc.BuildManagerCompiledView.Render'

Visual Studio は、呼び出されるたびに表示テンプレートを再コンパイルしているようです。これもまた、何百回も呼び出されます。私の考えでは、Visual Studio はファイルをコンパイルし、ネットワーク共有に保存し、何らかの方法で新しい時刻をスタンプし、Visual Studio はファイルが変更されたと認識します。そのため、Visual Studio はそれをもう一度再コンパイルします。ただし、これはあくまでも仮説であり、私にはまったくわかりません。

まず、どうやらオフライン ファイルがあるようです (これはオフィスのデスクトップ コンピューターなので、気にしません)。無効にして再起動し、明日再試行します。

さらに、プロジェクトをそのままローカルの C: に移動すると、問題は解決します。読み込みが非常に速くなります。しかし、これは作業環境には理想的ではありません。以前のバージョンは失われ、手動でコピーしない限りコードはバックアップされず、誰とも共有されなくなります。

必要であれば、C からネットワーク共有にコピーするだけで済みます。すべてのページが読み込まれるまで 2 分も待つのは、はるかに面倒です。

ベストアンサー1

Visual Studio 2012 で「シンボルの読み込みが遅い」問題を解決した方法は次のとおりです。

  • ツール -> オプション -> デバッグ -> 全般に移動します

  • 「自分のコードのみを有効にする」の横にあるチェックマークをオンにします。

  • ツール -> オプション -> デバッグ -> シンボルに移動します

  • 「...」ボタンをクリックし、キャッシュされたシンボルを保存するために、ローカル コンピューターのどこかに新しいフォルダーを作成/選択します。私は「Symbol caching」という名前を付け、それを Documents -> Visual Studio 2012 に配置しました。

  • 「すべてのシンボルを読み込む」をクリックし、Microsoft のサーバーからシンボルがダウンロードされるのを待ちます。これにはしばらく時間がかかる場合があります。「すべてのシンボルを読み込む」ボタンはデバッグ中のみ使用できることに注意してください。

  • Visual Studio が Microsoft サーバーをリモートで照会できないようにするには、「Microsoft シンボル サーバー」の横にあるチェックマークをオフにします。

  • 「OK」をクリックします。

今後は、シンボルの読み込みがはるかに高速になるはずです。

Microsoft アセンブリに変更やダウンロードを加えた場合は、[シンボル] ダイアログ ボックスに戻って、もう一度 [すべてのシンボルを読み込む] を実行する必要があることに注意してください。

おすすめ記事