“Não é possível avaliar a expressão porque o código do método atual está otimizado” no Visual Studio 2010

153

Estou usando o Visual Studio 2010 no modo de depuração e tenho "otimizar código" desmarcado. Não consigo observar rapidamente (ou passar o mouse) qualquer variável no depurador. Eu recebo este erro "Não é possível avaliar a expressão porque o código do método atual está otimizado".

Mesmo uma linha como: int i = -3, observando rapidamente i, recebo "Não é possível obter o valor do local ou do argumento 'i', pois não está disponível neste ponteiro de instrução, possivelmente porque foi otimizado".

Este link mencionado em uma pergunta semelhante parece não se aplicar.

Está faltando uma configuração?

Tony_Henrich
fonte
4
torulflundgren.blogspot.com.au/2010/03/… Essa é a melhor solução que encontrei para isso. Eu testei isso no visual studio 2013 e trabalhou ....
Dulanjana Wickramatantri

Respostas:

167

Enquanto o projeto estava no modo de depuração, a solução não estava. Quando eu mudei, funcionou.

Tony_Henrich
fonte
9
Eu tive esse problema no VS2012, no entanto, a solução e todos os projetos foram definidos como Depuração sem otimização. Eu limpo solução / reconstruir fixo para mim.
saarp
20
Então ... Como você define a solução para o modo sem depuração?
user1431072
user1431072 - você clica com o botão direito do mouse na sua solução ou projeto e escolhe a propriedade, e pode configurá-lo para o modo de depuração
Yevgraf Andreyevich Zhivago
48

Eu tive esse problema quando estava usando o VS 2010. Minha configuração da solução (Debug) foi selecionada. Resolvi isso desmarcando a propriedade Otimizar código nas propriedades do projeto. Projeto (clique com o botão direito) => Propriedades => Compilar (guia) => desmarque Otimizar código

Vin
fonte
29

Parece que você está depurando uma versão otimizada / lançada, apesar de a caixa otimizada desmarcada. As coisas que você pode tentar são:

  • Faça uma reconstrução completa do seu arquivo de solução (clique com o botão direito do mouse na solução e selecione Reconstruir tudo)
  • Durante a depuração, abra a janela de módulos (Debug -> Windows -> Modules) e encontre seu assembly na lista de módulos carregados. Verifique se o Caminho listado no seu assembly carregado é o que você espera que seja e se o carimbo de data / hora modificado do arquivo indica que o assembly foi realmente reconstruído.
  • A janela de módulos também deve informar se o módulo carregado está ou não otimizado - verifique se a janela de módulos indica que não está otimizado.

Se você não conseguir ver o item de menu Módulos no menu Debug -> Windows, pode ser necessário adicioná-lo no menu "Personalizar ...".

Justin
fonte
2
A solução é reconstruída. A janela de módulos mostra que a montagem está otimizada. Eu tenho a caixa de seleção Otimizar desmarcada, então não sei por que a montagem é sempre otimizada. A solução tem um projeto da web, mas o código que estou vendo está em um projeto de biblioteca de classes no modo de depuração.
Tony_Henrich
@Tony - pergunta boba, mas a biblioteca de classes tem a caixa de seleção "Otimizado" desmarcada?
1125 Justin Justin
Sim. Eu mencionei esse fato na minha pergunta. Eu já respondi minha própria pergunta.
Tony_Henrich 10/08
1
Meu Project.Webtem Otimização desmarcada, mas ainda aparece como Otimizado quando olho para seu assembly em Debug > Modules:(
J86
A única maneira que encontrei para forçar o VS a atualizar as informações de depuração foi aumentar a versão de montagem do módulo que ainda era considerada otimizada, enquanto a opção não estava marcada.
Alphanoch
14

No VS2013, acesse: Ferramentas -> Opções -> Depuração -> Geral e ative 'Usar o modo de compatibilidade gerenciada'. Isso desativa o novo comportamento de avaliação da função.

Jesse
fonte
Obrigado! Das outras soluções oferecidas, essa foi a que importava para mim. Estranho foi que aconteceu de repente, eu me pergunto o que causou a mudança.
squid808
10

Tente executar no modo de depuração. Se você estiver executando no modo de liberação, receberá esta mensagem.

thejustv
fonte
5
A pergunta diz, simples como o dia: "Estou usando o Visual Studio 2010 no modo de depuração e tenho" otimizar código "desmarcado". ... você deve excluir essa não resposta.
Jim Balter
Seriamente. Ele diz isso na pergunta que ele está executando na depuração. Eu não entendo o porquê dos votos positivos. Esta resposta está poluindo as possíveis resoluções
John Demetriou
1
FWIW, esta pergunta está classificada no Google quando você pesquisa essa mensagem de erro. Esta resposta foi correta para mim (não sabia que estava no modo de lançamento).
Nate Barbettini
Ele pode ter mais de um assembly e, no gerenciador de configuração, o assembly pelo qual está depurando pode ser definido para liberar ou sth.
Madoxdev 13/1218
8

Minha situação não foi coberta por nenhuma das respostas acima. Encontrei o seguinte: Artigo do MSDN sobre encadeamento que explica que, quando preso em algumas operações primitivas de encadeamento nativo, o depurador não pode acessar os dados. Por exemplo, quando um thread está em Task.Wait (), isso aparece.

Alan Baljeu
fonte
8

Eu tive o mesmo problema. Mas, no meu caso, o Debuggableatributo foi codificado no AssemblyInfo.csarquivo do meu projeto e, portanto, não foi (sobrescrito) por compilação. Funcionou após remover a linha que especifica o Debuggableatributo.

riQQ
fonte
8

Para mim, isso estava acontecendo no VS2017 e no VS2019. Parou de acontecer depois que eu selecionei a opção "Otimização de JIT suprimida na carga do módulo".

insira a descrição da imagem aqui

farfareast
fonte
+1, este foi a causa do meu problema. O VS não parece muito bom para realmente entender as opções csproj, pois otimizei o desligado no XML quando a configuração termina com "Debug". Funciona bem ao chamar o MSBuild diretamente, mas não exatamente no VS.
TheBeardedQuack
5

Eu tive o mesmo problema no VS2008. No meu caso, foi resolvido via solução-reconstruir.

Ingmar
fonte
4

Além do @Kragen mencionado, se você estiver depurando um projeto da web

feche o visual studio e tente excluir os arquivos temporários em C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Arquivos temporários do ASP.NET

testuser
fonte
A solução possui um projeto da Web, mas o código está no projeto da biblioteca de classes. Eu apaguei os arquivos temporários muitas vezes.
Tony_Henrich
4

Outra coisa que você pode fazer é criar um arquivo com o mesmo nome da dll otimizada, mas com a extensão ini e adicionar o seguinte:

[Controle de depuração do .NET Framework]
GenerateTrackingInfo = 1
AllowOptimize = 0

Isso instruirá o JIT a não otimizar suas variáveis.

Observe que você ainda precisa do pdb, então você terminará com algo assim: yourDll.dll yourDll.pdb yourDll.ini

Isso funciona especialmente bem em cenários em que você não tem acesso para gerar novamente as DLLs com a opção de depuração.

http://www.hanselman.com/blog/DebugVsReleaseTheBestOfBothWorlds.aspx

Bongo Sharp
fonte
4

Quando você vir a mensagem " Não é possível avaliar a expressão porque o código do método atual está otimizado " . Depois de emitir uma Debugger.Break()instrução, certifique-se de pressionar F10 para avançar para a próxima instrução.

Depois de passar para a próxima instrução e assumindo que você esteja executando uma compilação de depuração, essa mensagem deve desaparecer.

Jeroen Ritmeijer
fonte
2
Foi isso. Eu tentei todas as soluções acima e essa pequena coisa deu certo .. Obrigado por compartilhá-lo, eu
gastaria
Nop. Não funcionou. Vs17 ainda pensa que estou a depuração de um compilação de lançamento
John Demetriou
3

Em relação ao problema com a propriedade "Otimizar código" sendo DESATIVADA, o código ainda está sendo compilado como otimizado: O que finalmente me ajudou depois de tentar tudo foi marcar a caixa de seleção "Ativar depuração de código não gerenciado" na mesma página de configurações (Propriedades do projeto - Depuração). Não está diretamente relacionado à otimização do código, mas com isso ativado, o VS não otimiza mais minha biblioteca e posso depurar.

Miloš
fonte
3

Eu tive o mesmo problema ao depurar uma biblioteca de classes de um aplicativo da web testbed. Eu estava fazendo referência à versão de lançamento no banco de testes e isso foi definido para ser otimizado nas propriedades da biblioteca de classes.

Desmarcar a caixa de seleção otimizar código para a versão de lançamento nas propriedades da biblioteca de classes, enquanto estou escrevendo, resolveu o problema.

tekiegirl
fonte
Graças a isso. Você pode encontrar essa caixa de seleção clicando com o botão direito do mouse em todos os projetos e selecionando a opção do menu "Propriedades" e, em seguida, a guia "Construir".
goamn
3

Sei que essa é uma resposta posterior, mas encontrei outra referência a uma maneira de resolver esse problema que pode ajudar outras pessoas no futuro. Esta página da web descreve a configuração de uma variável de ambiente (COMPLUS_ZapDisable = 1) que impede a otimização, pelo menos para mim! (Não esqueça a segunda parte de desativar o processo de hospedagem do Visual Studio.) No meu caso, isso pode ter sido ainda mais relevante porque eu estava depurando uma DLL externa através de um servidor de símbolos, mas não tenho certeza.

Michael Bray
fonte
3

Eu tive esse problema com um projeto F # que esteve aqui e ali entre o Visual Studio e o MonoDevelop, talvez originando-se no último (eu esqueço). No VS, a caixa de otimização estava desmarcada, mas a otimização certamente parecia estar ocorrendo no que diz respeito ao depurador.

Depois de comparar o XML do arquivo do projeto com o de um íntegro, o problema era óbvio: o projeto íntegro tinha uma <optimize>false</optimize>linha explícita , enquanto o ruim estava completamente ausente. O VS estava obviamente deduzindo de sua ausência que a otimização estava desabilitada, enquanto o compilador estava fazendo o oposto.

A solução foi adicionar essa propriedade ao arquivo do projeto e recarregar.

Jason Holloway
fonte
1

Comecei a receber esta mensagem quando migrei para o Visual Studio 2017. Nenhuma das idéias nesta página que tentei funcionou para mim. Em outro post, encontrei esta sugestão e funcionou - remova:

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]

... do seu arquivo AssemblyInfo.

Gato maluco
fonte
Te amo @Crazy Cat. Isso aconteceu comigo quando migrei para o VS2019.
Antonio Rodríguez
0

Eu tive o mesmo problema no VS 2010. Limpei e recompilei a solução e ela funcionou.

Sanjay Gupta
fonte
0

O comentário de vickramds acima, referente a http://torulflundgren.blogspot.com.au/2010/03/cannot-obtain-value-of-local-or.html , fez isso por mim. Eu verifiquei tudo - excluí todas as DLLs, arquivos pdb das pastas bin locais, Limpa, Reconstrói, limpa todas as pastas dos Arquivos temporários do ASP.NET, garante que os sinalizadores TRACE / DEBUG sejam definidos, verifica os caminhos da DLL, etc.

Para colocá-lo para que não seja perdido, no (s) projeto (s) afetado (s):

Propriedades do projeto -> Compilar -> Avançado -> Informações sobre depuração: total.

Você deseja verificar se a configuração de Depuração foi selecionada antes de fazer isso, a menos que você pretenda o contrário.

Mayyit
fonte
0

Se você estiver tentando depurar um projeto do ASP.NET, verifique se o menu suspenso Propriedades> Web> Servidores do projeto está definido como "IIS Express" (além de verificar tudo o mais aqui).

Overlord Zurg
fonte
0

Eu misturei dlls de extensão c ++ / cli mfc, que foram otimizadas mesmo se a configuração de depuração (vista na janela VS 2017 Modules). Como a resposta anterior sugeriu, mudei "No VS2013, vá para: Ferramentas -> Opções -> Depuração -> Geral e ative 'Usar o modo de compatibilidade gerenciada'. Isso desativa o novo comportamento de avaliação da função." Essas configurações também são encontradas no VS 2017.

Mas isso não foi suficiente, então também copiei a configuração UseDebugLibraries do arquivo de projeto de outro aplicativo MFC para a extensão do arquivo de projeto dll.

    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
      ...
      <UseDebugLibraries>true</UseDebugLibraries>

Em seguida, reconstrua e resolva o problema.

owluCoder
fonte
0

No Visual Studio 2012, ativar a opção " Gerenciado " em Ferramentas> Depuração> Just-In-Time funcionou para mim.

insira a descrição da imagem aqui

QMaster
fonte