Não é possível obter o valor do local ou argumento, pois não está disponível neste ponteiro de instrução, possivelmente porque foi otimizado


211

O Visual Studio 2010 mata dados (não há outra palavra) em um dos argumentos da função no bloco não seguro. O que poderia causar esse erro? A seguinte mensagem é exibida pelo depurador.

Cannot obtain value of local or argument as it is not available at this instruction pointer, possibly because it has been optimized away.

2
Eu tenho exatamente o mesmo problema e estou usando o Debug build. Cannot obtain value of local or argument '<this>' as it is not available at this instruction pointer, possibly because it has been optimized away. System.Threading.Tasks.TaskExceptionHolder
javapowered

19
Liberação oops eu só tinha selecionado por engano ..
Daniel Little

Estou com esse problema no VS 2017 e segui todas as instruções nas postagens abaixo. Existem outras opções?
Matt W

Não se esqueça do Menu Build -> Configuration Manager. A configuração precisa ser definida como Debug lá ou você ainda terá o problema.
Bob Clegg

Respostas:


343

Vá para Propriedades do projeto e, em Compilar, verifique se a caixa de seleção "Otimizar código" está desmarcada.

Além disso, defina o menu suspenso "Informações de depuração" como "Completo" nas Opções avançadas (na guia Compilar).


128
Primeiro, verifique se a Configuração da compilação é Debug, não Release.
ApceH Hipócrita

A propósito, se você quiser testá-lo no modo Release, poderá adicionar "Debugger.Launch ();" no código
Jason

Realizou as duas etapas e alterou a configuração de "Release" para "Build". Trabalhou no Visual Studio 2017 Community Edition.
Neo

1
Se você possui o VS 2017, a resposta aceita e a resposta de xyq.384.b ajudarão. Para mim resposta xyq.384.b foi a correção como era depurador JIT que estava suprimindo o ponteiro ... Eu sou JIT muito "otimizado"-lo ...
BillRuhl

Depois de mudar para a configuração de depuração, descobri que a caixa de código de otimização já estava desmarcada. Lição aprendida: não depure no modo de configuração de liberação.
Eliteproxy 6/12/19

135

Também no VS 2015 Community Edition

vá para Depurar-> Opções ou Ferramentas-> Opções

e marque Depuração-> Geral-> Suprimir a otimização JIT na carga do módulo (somente Gerenciado)


7
Isso resolveu meu problema depois de aplicar todas as soluções mencionadas acima.
masih 25/05

1
Nenhuma das respostas sugeridas funciona para mim. Minhas variáveis ​​ainda estão otimizadas ...
Sushi271

Não faço ideia por que isso de repente começou a acontecer ... mas isso corrigiu!
precisa saber é o seguinte

Caramba, isso também corrigiu para mim na Comunidade VS2017! Não faço ideia de quando ou como essa opção foi desmarcada ...
Ian Kemp

Funciona como um campeão!
BillRuhl 12/02/19

59

Se você compilar com as otimizações ativadas, muitas variáveis ​​serão removidas; por exemplo:

SomeType value = GetValue();
DoSomething(value);

aqui a variável local valuenormalmente seria removida, mantendo o valor na pilha - um pouco como se você tivesse escrito:

DoSomething(GetValue());

Além disso, se um valor de retorno não for usado , ele será descartado via "pop" (em vez de armazenado em um local via "stloc" e, novamente; o local não existirá).

Por esse valuemotivo , nessa compilação, o depurador não pode obter o valor atual porque não existe - ele existe apenas pelo breve instante entre GetValue()e DoSomething(...).

Assim; se você deseja depurar ... não use uma versão compilada! ou pelo menos, desative as otimizações enquanto você depura.


4
Obrigado pela sua resposta - mas eu checo a propriedade Otimizar código no meu projeto e ela não está selecionada = (
curiosity

4
@ Marc - eu entendo o que você está dizendo, no entanto, eu estou usando as bibliotecas de fontes de referência da Microsoft para codificar passo através de sua própria porcaria. Estou percorrendo os métodos agora, mas não consigo observar nenhum dos valores dos habitantes locais. Qual é o ponto de depurar a fonte .Net, então? Alguma sugestão? stackoverflow.com/questions/13147132/…
one.beat.consumer

Parece que estou fazendo o mesmo que @ one.beat.consumer: tentando passar pelos símbolos públicos da Microsoft para entender por que a estrutura do ASP.NET não está funcionando. No meu caso, a ligação modelo no MVC 3 ...
BamBams

@ one.beat.consumer Estou supondo que as referências da Microsoft foram compiladas com a otimização ativada, portanto, mesmo que você possa fazer o download do código-fonte para ver os valores desaparecerem, é o mesmo que compilar seu projeto com otimizações ativado. É específico do projeto (dll) - se você pode obter versões "debug" das referências do MS, poderá ver valores. Não esqueça que se a dll do MS foi referenciada por outro projeto ao qual seu projeto principal está referenciando, a "subreferência" pode corresponder às configurações do outro projeto.
drzaus 9/12/16


20

Acabei de encontrar isso e estava executando na Releaseconfiguração de Debugcompilação em vez de na configuração de compilação. Uma vez que voltei para a Debugminha variável mostrada no relógio novamente.



8

Quando me deparei com o mesmo problema, tinha apenas que limpar minha solução antes de reconstruir. Isso cuidou disso para mim.


6

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). Ele 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.


1
A segunda sugestão fez tudo funcionar novamente, obrigado!
CodeMilian

1
No VS 2015, eu não vejo Enable unmanaged code debugging. Há Enable native code debugging, eu tentei verificando isso, mas isso não fez diferença.
Al Lelopath

1
No VS 2015, verifiquei a opção Ativar "código nativo" na compilação do projeto, Web, depuradores e tudo funcionou.
Mouffette 19/08

6

Eu enfrentei o mesmo problema e a solução para mim é mudar Solution Configurationde Releasepara Debug. Espero que ajude


4

No meu caso, eu estava trabalhando em um projeto de API da Web e, embora o projeto tenha sido definido corretamente para depuração completa, ainda estava vendo esse erro toda vez que me anexava ao processo do IIS que tentava depurar. Então percebi que o perfil de publicação estava definido para usar a configuração de Liberação. Portanto, mais um lugar para verificar é o seu perfil de publicação, se você estiver usando o recurso 'Publicar' do seu projeto de API da web do dotnet.


3

Eu descobri que tinha o mesmo problema quando estava executando um projeto e depurando anexando a um processo do IIS. Eu também estava executando no modo de depuração com otimizações desativadas. Embora eu ache que o código tenha sido compilado corretamente, quando desanexei e tentei compilar, uma das referências não foi encontrada. Isso ocorreu devido a outro desenvolvedor aqui que fez modificações e alterou o local da referência. A referência não apareceu com o símbolo de alerta, então pensei que estava tudo bem até fazer a compilação. Depois de fixar a referência e executar novamente, funcionou.


1

Como resposta adicional para aqueles que enfrentam esse problema ao depurar o aplicativo Web de sites do Azure:

Ao implantar no GitHub, por exemplo, o código é compilado no servidor do Azure otimizado por padrão.

Eu digo ao servidor para compilar de uma maneira depurável, definindo SCM_BUILD_ARGScomo/p:Configuration=Debug

mas há mais opções. Veja isto: http://azure.microsoft.com/blog/2014/05/08/introduction-to-remote-debugging-on-azure-web-sites-part-3-multi-instance-environment-and-git /


1

No Visual Studio 2012:

Vá para as propriedades do projeto -> Depurar -> Desmarque a opção "Ativar o processo de hospedagem do Visual Studio"


1

Para aplicativos da Web, existe outro problema importante e é selecionar a configuração correta durante o processo de publicação do aplicativo.

Você pode criar seu aplicativo no modo de depuração, mas pode ser que você o publique no modo de liberação, que omite o código por padrão, mas o IDE pode enganar você, pois mostra o modo de depuração enquanto o código publicado está no modo de liberação. Você pode ver detalhes no instantâneo abaixo: insira a descrição da imagem aqui


0

Verifique se você tem um atributo Debuggable no seu arquivo AssemblyInfo. Se houver, remova-o e reconstrua sua solução para verificar se as variáveis ​​locais estão disponíveis.

Meu atributo debuggable foi definido como: DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints que, de acordo com este artigo do MSDN, informa ao compilador JIT para usar otimizações. Eu removi esta linha do meu arquivo AssemblyInfo.cs e as variáveis ​​locais estavam disponíveis.


0

No Visual Studio 2017 ou 2015:

Vá para a Solução, clique com o botão direito do mouse na solução e selecione Propriedades-> selecione toda a Configuração-> Depurar e clique em OK. Após essa reconstrução e execução, essa solução funcionou para mim.


0

Eu tive o mesmo problema. Tentei todas as opções acima e descobri que também tinha que excluir tudo dentro de {PROJECT_ROOT} \ bin \ Release \ netcoreapp2.2 e {PROJECT_ROOT} \ obj \ Release \ netcoreapp2.2 do meu projeto. Definitivamente, foi relançado para publicação porque, embora eu use ferramentas de implantação / bitbucket no meu Azure Web App, tentei o Build >> Publish >> Publish to Azure porque queria inspecionar quais arquivos foram realmente implantados.


0

Teve o mesmo problema antes com um aplicativo WPF e todas as soluções aqui NÃO resolveram o problema . O problema era que o módulo já estava otimizado para que as seguintes soluções NÃO FUNCIONAM (ou não são suficientes para resolver o problema):

  • Caixa de seleção " Otimizar código " desmarcada
  • " Suprimir otimização JIT na carga do módulo " marcada
  • Configuração da solução em DEBUG

O módulo ainda está carregado Otimizado. Veja a captura de tela a seguir: Módulo otimizado


Para resolver esse problema, você deve excluir o módulo otimizado. Para encontrar o caminho do módulo otimizado, você pode usar uma ferramenta como o Process Hacker .

Clique duas vezes no seu programa no " Painel de processos " e, na nova janela, abra a guia " .NET Assemblies ". Em seguida, na coluna " Caminho da imagem nativa ", você encontra todos os caminhos dos módulos otimizados . Localize o que você deseja otimizar e exclua a pasta (veja a captura de tela abaixo): insira a descrição da imagem aqui (botei o nome da minha empresa por razões óbvias)

Reinicie seu aplicativo (com a caixa de seleção na etapa 1 marcada corretamente) e deve funcionar.

Nota : O arquivo pode estar bloqueado quando foi aberto por outro processo, tente fechar o Visual Studio. Se o arquivo ainda estiver bloqueado, você pode usar um programa como o Lock Hunter

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.