asp.net mvc - very - Depuração/carregamento do Visual Studio muito lento




visual studio debugging too slow (20)

Eu estou no final de juízo. O Visual Studio normalmente é extremamente lento para depurar ou simplesmente carregar ("iniciar sem depurar") meus sites ASP.NET MVC. Nem sempre: no início, os projetos serão carregados de forma agradável e rápida, mas, quando carregarem devagar, sempre carregarão lentamente depois disso. Eu poderia estar esperando 1-2 minutos ou mais.

Minha configuração:

Estou usando o Visual Studio 2012 Express , atualmente, mas também tive o mesmo problema no Visual Studio 2010 Express. Minha solução é armazenada em uma unidade de rede; especificamente, os Meus Documentos são redirecionados para uma unidade de rede, se isso for importante. (Não deveria. Há momentos em que o meu site carrega muito rápido sob esta configuração.)

Eu carrego no Internet Explorer 9 normalmente, mas o mesmo problema acontece no Firefox.

Isso pode acontecer em qualquer projeto ASP.NET MVC em que eu trabalhe, e parece girar em torno de ter DisplayTemplates, que todos os meus projetos ASP.NET MVC fazem. E é tudo C # e Razor, se isso importasse.

Sintomas:

O sistema carregará meus símbolos centenas de vezes. Basicamente, o seguinte, mas há pelo menos 300 dessas linhas, cada uma com arquivos DLL sempre um pouco diferentes para os mesmos CSHTMLs:

'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.

Acima, tenho três DisplayTemplates: "Contact", "Location" e "StatusCode". Parece que o IIS está carregando símbolos duas vezes para cada vez que o displaytemplate é chamado. Assim, se eu estiver exibindo uma tabela de 100 entradas que chama todos os três desses modelos de exibição, são 600 símbolos separados carregados.

Esta não é uma operação rápida também. Examinando os arquivos de log gerados pelo IIS, são necessários cerca de 200 ms para cada símbolo carregar. Assim, atrasos super longos.

O que eu tentei:

  • Debug ou Release version, não importa.
  • Colocar meu projeto em uma implementação completa do IIS em um servidor da Web o executa rapidamente sem problemas.
  • Cassini, IIS Express 7.5 e IIS Express 8.0, todos têm o problema.
  • Excluir todos os pontos de interrupção não faz nada.
  • Solução limpa , ou excluir o .suo também não fazem nada.
  • Se eu reparar o IIS Express, ou excluir a pasta My Docs\IISExpress , ou reparar / reinstalar o Visual Studio, o problema PODE desaparecer, mas apenas por um tempo, antes de voltar.

Qualquer conselho é apreciado.

Para responder a mais perguntas, sim, minha máquina definitivamente tem a potência. O mais irritante é que o mesmo projeto, com NADA alterado, pode carregar muito rapidamente às vezes, geralmente depois de eu reparar o IIS Express e excluir a pasta My Docs\IISExpress . Eventualmente, "algo" acontece e é reduzido para 2 minutos para carregar novamente. O que eu estou trabalhando não é um projeto complicado. Nenhuma biblioteca ou dependências externas, e meu VS.NET não possui addons what-so-ever.

É importante observar que esta máquina possui o Symantec Endpoint Protection, que tem um histórico de causar estragos. Mas desativá-lo imediatamente (é bom ser um administrador) não resolveu o problema.

Eu tenho uma teoria neste momento. Eu estou pensando que isso é tudo porque eu estou trabalhando fora de uma pasta redirecionada de um compartilhamento de rede. Enquanto o depurador estava passando por centenas de linhas de "símbolos carregados", parei para ver o que estava fazendo. Estava no meu código, carregando o DisplayTemplate que eu tinha. Pisando na saída do modelo isto:

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'

Parece que o Visual Studio está recompilando meu displaytemplate toda vez que é chamado, o que é novamente, centenas de vezes. Minha teoria é que o Visual Studio compila o arquivo, salva-o no compartilhamento de rede, o compartilhamento de rede e, de alguma forma, marca um novo horário nele, e o Visual Studio acha que o arquivo foi alterado e, portanto, o Visual Studio o recompõe novamente. Apenas uma teoria embora; Eu realmente não tenho ideia.

Por um lado, aparentemente eu tenho arquivos off-line (este é um computador desktop em um escritório, eu não poderia me importar menos). Vou desativar, reiniciar e tentar novamente amanhã.

Além disso, mover meu projeto, como está, para o C local: corrige-o. Ele carrega muito rapidamente. Mas isso não é ideal em um ambiente de trabalho. Eu perco as versões anteriores, meu código não é salvo em backup, a menos que eu copie-o manualmente e não seja mais compartilhado com ninguém.

Eu posso me contentar com copiar e voltar de C para o compartilhamento de rede, se for para isso. É muito mais irritante esperar dois minutos por cada carregamento de página.


Abra a pasta de solução no Windows Explorer, feche o visual studio, apague o arquivo .suo do Windows Explorer.

Agora abra o projeto no visual studio, esperamos que o depurador seja anexado / desanexado rapidamente.


Acho que finalmente posso pelo menos conhecer a causa, embora não seja o motivo. Quando o problema começou a ocorrer novamente, notei uma tonelada de processos "conhost.exe" órfãos. Eu fecharia o Visual Studio e eles permaneceriam abertos. Finalizar a tarefa em cada um deles finalmente resolveu o problema de maneira confiável. [esperançosamente]

(Apenas note que o conhost.exe não é um processo do Visual Studio, embora o Visual Studio o use. Assim, outros usuários podem ter outros aplicativos que executam o conhost.exe. Eu sei que a minha máquina não é por isso que consigo terminar com segurança tarefa todos eles, mas YMMV.)

Por que isso acontece? Parece ocorrer quando eu abro mais de um projeto de uma só vez, o que costumo fazer com frequência, embora eu apenas compile e depure um deles a qualquer momento.

Editar # 1 - Esta não é uma "bala de prata", infelizmente. Nem sempre funciona para mim. Normalmente, quando as coisas ficam lentas, eu fecho todas as minhas sessões do Visual Studio, depois entro no gerenciador de tarefas e termino qualquer instância dele, conhost.exe, iisexpress.exe Microsoft.VisualStudio.Web.Host.exe e MSBuild.exe Eu posso encontrar.

Normalmente, depois disso, quando eu reiniciar meu projeto, ele será carregado rapidamente. Mas não sempre.

Realmente eu acho que o melhor curso de ação é provavelmente não construir e depurar o código de um compartilhamento de rede / pasta redirecionada.

Editar # 2 - dois anos mais tarde, e isso ainda é um problema para mim no Visual Studio Community 2013, mas parece pelo menos encontrar a tarefa culpada: Explorer.exe . Sim, quem sabia? No momento em que eu termino essa tarefa, a página carrega em um único segundo.

Se eu tiver um navegador de arquivos do Windows Explorer aberto na minha unidade de rede redirecionada (que geralmente é porque esse é o meu código), esse problema parece ocorrer. Fechar a janela não é suficiente, eu tenho que matar toda a tarefa do Explorer.exe. Eu só podia adivinhar o que está fazendo ... enlouquecendo com alças de arquivos?

Eu geralmente posso usar o gerenciador de tarefas para iniciar uma nova tarefa explorer.exe (eu só posso ter muito alt-tabbing), e Visual Studio continuará a carregar agradável e rápido. Mas se eu tanto abrir o Windows Explorer, quase sempre volta para o super-slow-mo.

Então, se você tem um compartilhamento de rede redirecionado, tente. Com certeza é melhor trabalhar localmente.


As acima são todas boas soluções e eu tentei todas elas, mas consegui a solução here , que é

Debug -> Delete All Breakpoints

Depois de passar o dia inteiro esperando que os símbolos carreguem tão lentamente quanto a velocidade da tartaruga, misturando e alternando entre todas as combinações possíveis: Apenas Meu Código, Símbolos de Cache , Intellitrace , Just-In-Time, processos de eliminação , etc.

Minha solução foi realmente desativar o antivírus . Sim, o Windows Defender estava desacelerando o lançamento do meu projeto! Ele iria verificar todas as dlls como o Visual Studio solicitou e retardou todo o processo de carregamento do símbolo.

Eu tenho que dizer que nossas máquinas têm ótimas especificações para compilar a solução muito rápido, então isso nunca foi um problema. Nós codificamos no VS 2013 Ultimate.


Esvaziar o cache de símbolos funcionou para mim.

Veja: barra de menu / Ferramentas / Opções / Depuração / Símbolos / Cache de Símbolos Vazios


Eu apaguei a pasta "Temporary ASP.NET Files" e o carregamento da minha página localhost melhorou dramaticamente. Aqui está o caminho ...% temp% \ Arquivos ASP.NET Temporários \


Eu não sei se você ainda está tendo esse problema, mas eu depurar sites no Visual Studio, anexando o depurador ao processo em si, em vez de deixar o VS fazer isso para mim e descobri que ele melhora muito os tempos. Eu uso uma extensão para VS chamado AttachTo e eu tenho um pequeno artigo sobre como usá-lo here .

Eu espero que isso ajude.


Eu também estava enfrentando esse problema, abaixo estão as etapas que eu executo e funciona para mim sempre:

  • Excluindo o arquivo .suo da solução.
  • Excluindo os arquivos ASP.NET temporários (você pode encontrá-lo em encontrá-lo em % WINDOW% \ Microsoft.NET \ Framework \\ ASP.NET Temporary Files )
  • Excluindo todos os pontos de interrupção no aplicativo.

Eu tive problemas de execução de execução com depuração também e eu tentei muitas opções de depurador. No meu caso, uma grande performance conseguida quando mudo esta opção:

Ferramentas - Opções - Depuração - Janela de Saída - (Configurações gerais de saída - Todas as saídas de depuração) - OFF


Há também complicações em visões parciais, onde há um erro na página que não é reconhecido imediatamente. Como Model.SomeValue em vez de Model.ThisValue. Pode não sublinhar e causar problemas na depuração. Isso pode ser uma dor real para pegar.


Nada disso funcionou para mim, mas eu encontrei um ponto de interrupção em um símbolo que foi excluído. Parece que 2010 estava pendurado nele. Para ver se este é o seu problema, faça o debug-> windows-> breakpoints. Se algum deles estiver lá, apenas os apague.

Saunders, mencionou que ele verificou isso, mas não foi mencionado nas soluções para este problema. Talvez conhecimento comum para alguns, mas não para todos nós.


No Visual Studio:

Ferramentas -> Opções -> Depuração -> Símbolos

Escolha "Somente módulos especificados". Clique no link "especificar módulos" e adicione um módulo em branco (clique no botão novo documento e clique em OK).


No meu caso, foi o .NET Reflector Visual Studio Extension (versão 8.3.0.93) com o VS 2012. A depuração levou 10 segundos para cada Step Over (F10).

No Visual Studio, vá para Ferramentas / Extensões e Atualizações ... e desabilite o .NET Reflector Visual Studio Extension . Não esqueça de reiniciar o Visual Studio.


No meu caso, notei que desabilitar minha conexão com a Internet faria com que ela rodasse tão rápido quanto com ctrl-f5, então eu fui para debug-> options-> symbols e apenas desmarcou todos os locais .pdb.

Parece que o VS estava tentando se conectar a esses servidores toda vez que uma sessão de depuração era iniciada.

Note que desabilitar Debug-> Options-> Debugging-> General "Habilitar suporte de fonte" ou "Requer que os arquivos de origem correspondam exatamente à versão original" não faria qualquer diferença.


Para mim, eu implementei essa dica que basicamente melhorou drasticamente o desempenho, adicionando os dois atributos a seguir à tag de compilação no web.config

<compilation ... batch="false" optimizeCompilations="true"> ... </compilation>

O que batch = "false" faz?

Torna a pré-compilação mais seletiva, compilando apenas as páginas que foram alteradas e exigem a recompilação

O que exatamente o optimizeCompilations está fazendo? Source

O ASP.NET usa um código de hash por aplicativo que inclui o estado de vários itens, incluindo a pasta bin e App_Code, e global.asax. Sempre que um domínio de aplicativo do ASP.NET é iniciado, ele verifica se esse código de hash foi alterado em relação ao que foi calculado anteriormente. Se tiver, então toda a pasta codegen (onde os assemblies compilados e os copiados em sombra viverem) é eliminada.

Quando essa otimização é ativada (via optimizeCompilations = "true"), o hash não leva mais em conta bin, App_Code e global.asax. Como resultado, se isso mudar, não eliminamos a pasta codegen.

Referência: elemento de compilação no msdn


Para mim, foram pontos de interrupção condicionais. Aqueles parecem realmente retardar as coisas.


Se alguém perceber esse comportamento saindo do campo à esquerda, verifique se você não tem pontos de interrupção definidos no web.config. Eu devo ter definido um com um clique do mouse, e ele realmente diminuiu todas as operações de depuração.


Uma coisa que funcionou para mim depois de fazer tudo o que foi dito foi:
Na janela Threads (Debug-> Windows-> Threads), defina Group by para None. Isso só pode ser feito durante a depuração.

Isso estava tendo um impacto mesmo depois de fechar essa janela.


Vá para suas variáveis ​​de ambiente e procure pela chave _NT_SYMBOL_PATH.

Delete isso.

Voila, funcionou como um encanto.


Você ativou o FusionLog?

Meu VisualStudio foi muito lento para iniciar, abrir solução e carregar símbolos ao iniciar a depuração. Foi lento apenas na minha máquina, mas não em outras máquinas.

O FusionLog grava toneladas de material de log em disco. Apenas desabilitá-lo no RegEdit resolveu tudo, no meu caso.

Esta é a chave FusionLog no registro:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion

Verifique o valor de ForceLog (1 ativado, 0 desativado).





cassini